单例模式之简约美

生活中的单例

中国(China),位于东亚,是一个以华夏文明为主体、中华文化为基础,以汉族为主要民族的统一多民族国家,通用汉语。中国疆域内的各个民族统称为中华民族,龙是中华民族的象征。古老的中国凭借自身的发展依旧美丽的屹立于东方民族之林,闪耀着她动人的光彩,世界上只有一个中国,任何部分都是祖国不可分割的一部分,今天我们的设计模式就从伟大的祖国开始说起---单例模式。

详解单例模式

单例模式是什么?跟我们的祖国有着怎样的关系呢?首先我们来看一下单例,从“单例”字面意思上理解为—一个类只有一个实例,所以单例模式也就是保证一个类只有一个实例的一种实现方法。官方定义:确保一个类只有一个实例,并提供一个全局访问点。在学习的过程中,我们需要把握三个主要的关键点,一、某个类只能有一个实例;二、它必须自行创建这个实例;三、它必须自行向整个系统提供这个实例。来看一下单例模式的结构图:

       实现方法

一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

代码实现

第一版(基本代码)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;  

namespace 单例模式基本模型
{
    class Program
    {
        //客户端
        static void Main(string[] args)
        {
            Singleton Instance1 = Singleton.GetInstance();
            Singleton Instance2 = Singleton.GetInstance();  

            if (Instance1 == Instance2)
            {
                Console.WriteLine("两个实例是一模一样的实例。");
            }  

        }
    }
    class Singleton
    {
        private static Singleton instance;  

        //构造方法采用private,外界便无法用new创建该类的实例
        private Singleton()
        { }  

        //该方法提供一个获得该类实例的全局访问点,是唯一的
        public static Singleton GetInstance()
        {
            //如果实例不存在,则返回一个新实例,否则返回原实例。
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}  

但是上述代码存在一些缺点,线程不安全,多线程情况下,多个线程同时访问Singleton,调用GetInstance()方法,同时判断instance==null,得到真值,导致创建多个实例,这不符合单例模式的基本原则。那我们要怎么办捏,为了解决以上缺点,我们来看改进的代码(一下版本的)

第二版(多线程时的单例)

class Singleton
    {
        private static Singleton instance=null;
        //创建一个静态只读的进程辅助对象
        private static readonly object ProgressLock = new object();  

        //构造方法采用private,外界便无法用new创建该类的实例
        private Singleton()
        { }  

        //该方法提供一个获得该类实例的全局访问点,是唯一的
        public static Singleton GetInstance()
        {
            lock (ProgressLock)
            {  

                if (instance == null)
                {
                    instance = new Singleton();
                }
            }  

            return instance;
        }
    }  

每次调用GetInstance()方法都需要lock,这种做法是会影响性能的,所以我们需要对这个类进行改良。

第三版(双重锁定)

class Singleton
    {
        private static Singleton instance=null;
        //创建一个静态只读的进程辅助对象
        private static readonly object ProgressLock = new object();  

        //构造方法采用private,外界便无法用new创建该类的实例
        private Singleton()
        { }  

        //该方法提供一个获得该类实例的全局访问点,是唯一的
        public static Singleton GetInstance()
        {
            if (instance == null)
            {
                lock (ProgressLock)
                {  

                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }  

            return instance;
        }
    }

上述构造方式只有在实例未被创建的时候才加锁,避免了每次调用GetInstance()方法都加锁损失性能的问题。但是相对于后面的做法,她仍然有着美中不足的地方。

第四版(静态初始化)

//sealed关键字防止派生
    public sealed class Singleton
    {
        //在第一次引用类的成员时创建实例,公共语言运行库负责处理变量的初始化
        private static readonly Singleton instance=new Singleton();  

        //构造方法采用private,外界便无法用new创建该类的实例
        private Singleton()
        { }  

        public static Singleton GetInstance()
        {
            return instance;
        }
    }  

这种方式是在自己被加载时就将自己实例化,称为饿汉式。由于有.NetFramework 进行初始化,所以我们对实例化机制的控制权较少,没办法和其他实现一样实现延迟初始化。在上面三种形式中,您能够在实例化之前使用非默认的构造函数或执行其他任务。

  第五版(完全延迟加载实例化)

public sealed class Singleton
 {
        private Singleton()
        {
        }
        public static Singleton GetInstance()
        {
            return Nested.instance;
        }
        class Nested
        {
            static Nested()
            {
            }
            internal static readonly Singleton instance = new Singleton();
        }
    }
        

  写在后面的话

前三版编程方法,因为会面临多线程访问安全的问题,需要做双重锁定这样的处理才可以保证安全,但能够在实例化之前使用非默认的构造函数或执行其他任务,第四版(静态初始化方式)是类一加载就实例化的对象,占用系统资源,所以到底实用哪一种方式,视具体情况而定.

单例模式之简约美

时间: 2024-10-08 06:45:15

单例模式之简约美的相关文章

在一个老外微信PM的眼中,中国移动App UI那些事儿

本文编译自Dan Grover的博客,他现在是腾讯微信的产品经理.以下是他从旧金山搬到广州后的近半年时间里,在试用过微信微博等中国主流移动App后,总结出的中美App在设计理念上的差异,并对中国移动App UI的发展趋势给出了自己的看法. 今年夏天,我从旧金山搬到了广州工作,成为了微信的一名产品经理. 搬到一个陌生的国家意味着许多事情要从头学起:比如要讲外语.适应饮食习惯差异等等.然而不到几个月我就惊讶地发现,开头我特别不习惯的东西对我已是轻车熟路. 我的数字生活也经历了这样一个过程.我卸掉了所

也许是你太复杂

学的越多越喜欢用复杂的思考方式. 简单可以解决绝大多数问题 . 逻辑应该越简单越好. 复杂的逻辑只会加大代码量. iPhone就是简单的基础上的设计. 有些问题可能是思路没有理顺,不能过于死板. 简单的逻辑就是去除掉一些多余的东西,留下些实用性高的东西. 我们追求简约美. 简单可以让程序跑的更快,用户体验永远是第一位. 简单思维能解决复杂问题. ----------------------------------------------------------------------------

移动应用UI设计(上)

1. 复杂的中文输入 拼音模糊匹配 中文的输入法千差万别,从拼音.手写.部首到颇具怀旧风的九宫格输入等,花样百出,尽管不同年代.不同成长环境的用户会选择不同的输入法,拼音输入却还是最为常用的一种. 但在中国的网站和App上,并不需要以上任意一种的输入方式.打开任何操作系统的搜索界面,只需输入拉丁字母,就能得到海量的中文搜索结果,通过智能纠错和模糊音功能,即使有错别字也无伤大雅.一旦适应了这种模式,就会不由得感慨:为什么其他国家的App没有这么人性化呢? 中国的App甚至强大到能处理各种各样的中文

到底什么是极简主义?

“现在特别流行极简主义设计”,那么,到底什么是极简主义?极简主义不光存在于网页设计中,像Logo设计.印刷设计.包装设计也都有相应的极简主义风格.目前流行的极简主义网页设计视觉风格是:使用纯粹的色彩以及简练唯美的照片. 极简主义网页设计流行使用创新式导航,不但易用,而且有种简约美,符合极简主义“回归功能”与“视觉简约”的双重理念.简约的外观.易用的功能,并不意味着极简主义网页设计很简单.事实上,优秀的极简风格作品需要复杂的设计流程. 有一种不错的极简主义设计方法是:先设计一个风格复杂的网页,然后

对各团队的评价意见

1.理财猫: 界面设计挺好. 数据库的连接怎么样?作为个人理财软件,需不需要考虑个人隐私的问题?需不需要注册登录进去?需不需要考虑安全性? 2.跑什么操: 界面简约朴素,挺好. 后台运行没有实现跑步的步长是通过数字设定的,能不能用一定的方法直接自动设定,而不是选择设定. 跑步的步数能不能根据运动时身体或者手臂的摆幅进行计算.每一次的跑步记录有相应的数据库进行存储? 4.铁大云盘: 作为铁大云盘,能不能直接用学号+校园卡密码进行登录?既然是铁大云盘,能不能节约流量,相当于以前的PT,可以省流量.上

选购新风机的关键知识点

随着冬天取暖季的到来,很多家庭开始准备购买空气净化设备.究竟是买空气净化器还是买新风净化器?现在的用户选购商品已经越来越专业,比如买手机的时候不单单看品牌,更要看手机的各种数据:内存多大?分辨率多少?续航多久?同样的,在选购新风净化系统时,我们也不要盲目追随国外品牌,更不要被所谓的外国制造.历史悠久忽悠的团团转,擦亮双眼,仔细看清新风系统的品质才是正解.那么应该从哪些方面判断一个新风净化系统的优劣呢? 用系统观念,做全屋整体解决方案 那装管道新风,还是无管道新风?如果你的房子还没有装修,如果您的

WePE修改增强版

hello,由于个人原因,潇啸已经很久没有更新过博文了,感谢关注的朋友.今天给大家带来的也是windows相关的东西,windows系统安装必备的PE工具:俗话说,开车的朋友一定要学会基本的修车技能,然而利用PE安装系统就是windows必备的技能,现在市面上有很多PE系统,但是大多是商业性质,带有很多广告或者推广:业界个性化的PE也层出不穷,以WePE为首,但是WePE的大佬已经不更新了,已经年久失修,现在网络也传出很多WePE的修改版本:潇啸也跟着这股网络风进行了对WePE的修改之路,除了安

126平温馨简约 邂逅美的家:装修公司:家庭装修:装饰公司:品牌装饰公司

126平温馨简约 邂逅美的家 设计师石吉祥   电话15127722651 业主:独立设计一直不在我们的考虑范围内,就怕不是同一公司的设计和施工在后期的沟通上会有问题.最后决定去罗澜装饰看看完全是因为设计风格和热情可爱的设计师~哈哈,当然啦~罗澜装饰的设计费也是一度让我们相当矛盾.可是约谈后,真心觉得那是一个认真贴心的设计师.当下就决定拍板罗澜装饰了!交完定金后直接量房!(之前磨磨蹭蹭犹豫来犹豫去的我们这次决定的尤其快!) 至于装修风格,其实最初想的是现代简约,后来被设计师的几个作品迷住了,想说

单例模式的几种实现--《java开发技术-在架构中体验设计模式和算法之美》

package com.doctor.java.design_pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /**  * 单例模式的几种实现--<java开发技术-在架构中体验设计模式和算法之美>  *   * @author doctor  *  * @time 2015年4月24日 下午11:11:03  */ public class SingletonPattern { /**  * @param a