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

    版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/u010786678/article/details/37739825
    单例模式(Singleton Pattern)
              保证一个类仅有一个实例,并提供一个訪问它的全局訪问点。




    近期一直在用VB.NET重构机房收费系统,在重构中就出现了一个这种问题:
                                                                        
            每点击一次充值的菜单,都会出现一个新的充值窗口。我就希望它要么不出现,出现也仅仅出现一个。这个就和我们今天讲的单例模式有关系了。

            大家都知道,世界上的全部事物都是独一无二的,也就是说没有哪两个事物是全然同样的。从这个角度来讲,每个事物相对于自身都是单例的。我们今天所讲的单例设计模式则有所差别,它是针对某一类事物来说,仅仅存在一个实例对象。

    用我们程序上的术语来讲就是一个类仅仅存在一个实例对象

            一个正常的类是能够通过new操作符随意创建对象实例的,怎样设计实现一个仅仅能产生一个对象实例的类呢?

            假设想要一个类仅仅能产生一个对象实例,就不能使用new操作符创建对象!

    咱们能够把类的构造方法声明为private方式。那么外部就不能使用new操作符创建对象了!那么外部类又该怎样创建对象实例呢?我们能够将创建对象的工作转移到类的内部。不在外部创建,外部知识获得这个对象实例而已,这样不但减少了对象之间的耦合,还能够实现单例。

    private Singleton()
            {
    
            }

            要实现单例,我们须要一个全局的静态实例对象。还须要在类内部声明一个静态方法。该方法就是实例化全局对象实例,然后返回。

    但仅仅是这样还不够。仅仅是这种话,假设每次都在静态方法中进行实例化,还是会产生多个对象实例,所以我们还须要进一步的改进。

    private static Singleton instance;
    <pre name="code" class="csharp">public static Singleton GetInstance() 
    
    

            在这里我们有两种方式:一、全局的对象实例是一个已经实例化好的。在静态方法中返回即可了;二、在静态方法中首先推断全局对象是否为null。假设是null则实例化,然后返回全局实例对象。这两种方式各有优缺点,使用的时候也须要注意一些问题。

    一、饿汉式单例类

        public sealed class Singleton       //阻止发生派生,而派生可能会添加实例
        {
            private static readonly Singleton instance = new Singleton();       //在第一次引用类的不论什么成员时创建实例
            private Singleton()
            {
    
            }
            public static Singleton GetInstance()
            {
                return instance;
            }
    
        }

    二、懒汉式单例类

    <pre name="code" class="csharp">class Singleton
        {
            private static Singleton instance;
    
            private Singleton()     //构造方法让其private,这就堵死了外界利用new创建此类实例的可能
            {
    
            }
            public static Singleton GetInstance()       //此方法是获得本类实例的卫衣全局訪问点
            {
                if (instance == null)     //若实例不存在,则new一个新实例,否则返回已有的实例
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }

    
                                                      client代码:
        class Program
        {
            static void Main(string[] args)
            {
                Singleton s1 = Singleton.GetInstance();
                Singleton s2 = Singleton.GetInstance();
    
                if(s1==s2)      //比較两次实例化后对象的结果是同样实例
                {
                    Console.WriteLine("两个对象是同样的实例。");
                }
    
                Console.Read();
            }
        }
    }



    懒汉式单例类:

          长处:不会产生内存浪费。由于共享实例对象開始没有被初始化。而是在获得共享对象的方法中动态生成实例的;

           缺点:多线程的程序中,多个线程同一时候訪问Singleton类,调用GetInstance()方法,会有可能造成多个实例。

    饿汉式单例类:

           缺点:会产生内存浪费,由于在载入Singleton类时就已经初始化共享对象实例;

           长处:多线程的程序中,多个线程同一时候訪问Singleton类也不会造成多个实例。运行效率高。


    利用双重锁定解决懒汉式单例类的同步问题:

    class Singleton
        {
            private static Singleton instance;
            private static readonly object syncRoot = new object();
            private Singleton()
            {
    
            }
            public static Singleton GetInstance()
            {
                if (instance==null)     //先推断实例是否存在,不存在再加锁处理
                {
                    lock(syncRoot)
                    {
                        if (instance==null)
                        {
                            instance = new Singleton();
                        }
                    }
                }
                return instance;
            }
        }


    使用场合:
           当在系统中某个特定的类对象实例仅仅须要有一个的时候,能够使用单例模式。须要注意的是,仅仅有真正有“单一实例”的需求时才可使用。













查看全文
  • 相关阅读:
    easyExcel入门
    UML-从需求到设计--迭代进化
    UML-操作契约总结
    102. Binary Tree Level Order Traversal
    98. Validate Binary Search Tree
    95. Unique Binary Search Trees II
    96. Unique Binary Search Trees
    94. Binary Tree Inorder Traversal
    84. Largest Rectangle in Histogram
    92. Reverse Linked List II
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10965898.html
  • Copyright © 2011-2022 走看看