zoukankan      html  css  js  c++  java
  • 设计模式-单例模式

             单例模式(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、灵活性:由于类控制了实例化过程,所以类能够灵活更改实例化过程。


  • 相关阅读:
    云谷分布式端口扫描与代理验证系统(一)简介
    Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf_爱过了就好_新浪博客
    分享:QT QJson库编译心得
    分享:Zed Attack Proxy 2.0 发布,Web 渗透测试
    LIBTOOL is undefined 解决方法
    linux下.a/.so/.la目标库区别
    LDAmath文本建模
    分享:SchemaCrawler 9.4 发布,数据库结构输出
    JQ也要面向对象~在JQ中扩展静态方法和实例方法
    将不确定变为确定~Flag特性的枚举是否可以得到Description信息
  • 原文地址:https://www.cnblogs.com/jhcelue/p/6763505.html
Copyright © 2011-2022 走看看