设计模式-单例模式

         单例模式(Singleton),保证类仅有一个实例,并提供一个访问它的全局访问点.

         通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象.一个最好的办法就是让类自身负责保存它的唯一实例.这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法.


 //客户端代码
        static void Main(string[] args)
        {
            Singleton s1 = Singleton.GetInstance();
            Singleton s2 = Singleton.GetInstance();
            if (s1 == s2)     //比较两次实例化后对象的结果是实例相同
            {
                Console.WriteLine("两个对象时相同的实例。");
            }
            Console.Read();
        }

 //单例模式的类
    class Singleton
    {
        private static Singleton instance;
        private Singleton() //构造方法让其private,这就堵死了外界利用new创建此类实例的可能
        { }
        public static Singleton GetInstance()//此方法是获得本类实力的唯一全局访问点
        {
            if (instance == null)  //若实力不存在,则new一个新实例,否则返回已有的实例
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
         通过单例模式可以保证系统中一个类只有一个实例,而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源,如果希望在系统中某个类的对象只能存在一个,就用单例模式来解决就好了。

       但是,在多线程程序中,多个线程同时,注意是访问Singleton类,调用GstInstance()方法,会有可能造成创建多个实例的。多以需要给进程一把锁来处理。

  //多线程时的单例
        private static Singleton instance;
        private static readonly object syncRoot = new object();//程序运行时创建一个静态制度的进程辅助对象
        private Singleton()
        {
        }
        public static Singleton GetInstance()
        {
            lock (syncRoot)//在同一个时刻加了锁的那部分程序只有一个线程可以进入
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
            }
            return instance;
         Lock确保当一个线程位于代码的临界区时,另一盒线程不进入临界区。如果其他线程试图进入锁定的代码,则他将一直等待,只带该对象被释放。

单例模式的优点:1、实例控制:单例模式会阻止其对象实例化自己的单例对象的副本,congenial确保所有对象都访问一个实例。

                              2、灵活性:因为类控制了实例化过程,所以类可以灵活更改实例化过程。


评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值