• 设计模式-单例模式


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

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


     //client代码
            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、灵活性:由于类控制了实例化过程。所以类能够灵活更改实例化过程。


  • 相关阅读:
    iSCSI又称为IPSAN
    文档类型定义DTD
    HDU 2971 Tower
    HDU 1588 Gauss Fibonacci
    URAL 1005 Stone Pile
    URAL 1003 Parity
    URAL 1002 Phone Numbers
    URAL 1007 Code Words
    HDU 3306 Another kind of Fibonacci
    FZU 1683 纪念SlingShot
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6915585.html
Copyright © 2020-2023  润新知