Singleton模式

 

单例模式有以下特点: 

单例类只能有一个实例。 

单例类必须自己创建自己的唯一实例。 

单例类必须给所有其他对象提供这一实例。 

一个典型的单例类的实现如下所示:其中构造子私有表示子类不能被继承。 



public class Singleton 



private static Singleton m_instance = null; 



private Singleton() 





public static Singleton getInstance() 



if(m_instance==null) 



m_instance=new Singleton(); 



return m_instance; 



单线程的Singleton模式

    public class Singleton
    {
        private static Singleton instance;
 
        private Singleton() { }
 
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                    instance = new Singleton();
                return instance;
            }
        }
    }

多线程的Singleton模式

    public class Singleton
    {
        private static volatile Singleton instance = null;
 
        private static object lockHelper = new object();
 
        private Singleton() { }
 
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (lockHelper)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }
    }

使用.net特有的支持多线程的单件模式代码

    public sealed class Singleton

    {

        public static readonly Singleton Instance = new Singleton();

        private Singleton() { }

    }

代码说明:

  • sealed 修饰符表示该类是密封类,不能被继承。你可以按需修改。
  • 这里readonly关键字只是不希望客户程序将Instance字段设置为null等不合理的值。
  • *** static *** = new Singleton(); 是使用了内联初始化技术,这部分初始化其实是在static Singleton()中执行的。即上面的代码相当于:

    public sealed class Singleton

    {

        public static readonly Singleton Instance;

        static Singleton()

        {

            Instance = new Singleton();

        }

        private Singleton() { }

    }

  • 上述代码在编译时,会使用一个名为beforefieldinit元数据标志。此标志使得运行库能够在任何时候执行类型构造函数方法,只要该方法在第一次访问该类型的静态字段之前执行即可。换句话说,beforefieldinit 为运行库提供了一个执行主动优化的许可。如果没有 beforefieldinit,运行库就必须在某个精确时间运行类型构造函数,即,恰好在第一次访问该类型的静态或实例字段和方法之前。
  • 静态构造器自身就可以保证,多线程情况下,系统就可以保证只有一个执行。

缺点:

不支持参数化单件构造器。即静态构造器不支持参数,就导致我们无法利用静态构造器实现传参数的单件。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值