【一步一步学设计模式】(1)单例模式


接触编程语言之初就听说过设计模式,但直到现在都不知道该怎样用,适用哪些场合,只是了解少部分概念,以应付面试。

这段时间,赶项目的同时,每天抽一段时间来系统学下设计模式,总结各路技术大牛的经验加上自己的理解,用博文的方式记录下来。

其实,设计模式并非一种技术或者框架,更应该理解为前辈在探索路上总结的方法(思想),先从简单的学起。

废话说完,进入正题,走你...

单例模式【官方定义】:确保一个类只有一个实例,并提供一个全局访问点

根据定义,很容易得到单例模式的经典代码:

 public sealed class Singleton
    {
        //私有构造方法,外界不能用New 创建实例
        private Singleton()
        {

        }
        //私有变量保存类的实例
        private static Singleton instance;

        //全局访问点
        //线程不安全,多个线程同时访问GetInstance会冲突
        public static Singleton GetInstance()
        {  
             if (instance == null)
             {
                  instance = new Singleton();
              }
            
            return instance;
        }
    }
如果多个线程同时获取对象,理想状态下每个线程都会创建一个实例,就违背单例模式的初衷了,

改进如下,加一个控制线程的锁标识:

 public sealed class Singleton
    {
        //私有构造方法,外界不能用New 创建实例
        private Singleton()
        {

        }

        //私有变量保存类的实例
        //private static Singleton instance;
        //2016-1-25更新:为了保证多线程的情况下,每次读取instance都从内存而不是从cache中读取。换句话说,保证变量是最新的,不受其他子线程影响,应该这样定义,使用volatile关键字
        private static volatile Singleton instance; //定义一个标识,确保线程同步 
        private static readonly object lockHelper = new object(); //全局访问点 

        //线程不安全,多个线程同时访问GetInstance会冲突 
        public static Singleton GetInstance() 
        { 
            //线程第一次跑到这里,锁住 
            lock (lockHelper) 
            { 
              if (instance == null) 
               { 
                 instance = new Singleton(); 
                } 
             } 
           return instance; 
        } 
    }

 

在高级语言里,可以归纳为:

public class Singleton
{

    private Singleton(){}
    public static readonly Singleton instance = new Singleton();
}  

接下来简单说说单例模式的适用范围(个人理解),

一个项目中需要对同一个大类多次实例化并销毁,比如操作系统的任务管理器,只能打开一个。

资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置

控制资源的情况下,方便资源之间的互相通信。如线程池等

这样做的好处就是不用为每次实例化分配内存空间,某种程度上节省了开销。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值