• 单例模式


    首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了,

    比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,

    这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,

    即在整个的打印过程中我只有一个打印程序的实例。

    简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,

    任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)。

        

                  

    下面来看单例模式的结构图(图太简单了)

    image

    从上面的类图中可以看出,在单例类中有一个构造函数 Singleton ,

    但是这个构造函数却是私有的(前面是“ - ”符号),

    然后在里面还公开了一个 GetInstance()方法,

    通过上面的类图不难看出单例模式的特点,从而也可以给出单例模式的定义

    单例模式保证一个类仅有一个实例,同时这个类还必须提供一个访问该类的全局访问点。

    先来将 Singleton 写出来再说

             

            

    Singleton 类

    namespace Singleton
    {
        public class Singleton
        {
            //定义一个私有的静态全局变量来保存该类的唯一实例
            private static Singleton singleton;

            /// <summary>
            /// 构造函数必须是私有的
            /// 这样在外部便无法使用 new 来创建该类的实例
            /// </summary>

            private Singleton()
            {
            }

           /// <summary>
            /// 定义一个全局访问点
            /// 设置为静态方法
            /// 则在类的外部便无需实例化就可以调用该方法
            /// </summary>
            /// <returns></returns>

            public static Singleton GetInstance()
            {
            
       //这里可以保证只实例化一次
                //即在第一次调用时实例化
                //以后调用便不会再实例化

                if (singleton == null)
                {
                    singleton = new Singleton();
                }
                return singleton;
            }
        }
    }

    客户端代码

    using System;

    namespace SingletonTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Singleton.Singleton singletonOne =
                    Singleton.Singleton.GetInstance();
                Singleton.Singleton singletonTwo =
                    Singleton.Singleton.GetInstance();

                if (singletonOne.Equals(singletonTwo))
                {
                    Console.WriteLine("singletonOne 和 singletonTwo 代表的是同一个实例");
                }
                else
                {
                    Console.WriteLine("singletonOne 和 singletonTwo 代表的是不同一个实例");
                }

                Console.ReadKey();
            }
        }
    }

    运行结果为

    image

    从上面的结果可以看出来,尽管我两次访问了 GetInstance(),但是我访问的只是同一个实例,

    换句话来说,上面的代码中,由于构造函数被设置为 private 了,

    所以您无法再在 Singleton 类的外部使用 new 来实例化一个实例,您只能通过访问 GetInstance()来访问 Singleton 类,

    GetInstance()通过如下方式保证该 Singleton 只存在一个实例:

    首先这个 Singleton 类会在在第一次调用 GetInstance()时创建一个实例,并将这个实例的引用封装在自身类中,

    然后以后调用 GetInstance()时就会判断这个 Singleton 是否存在一个实例了,如果存在,则不会再创建实例。

    而是调用以前生成的类的实例,这样下来,整个应用程序中便就只存在一个实例了。

    从这里再来总结单例模式的特点:

    首先,单例模式使类在程序生命周期的任何时刻都只有一个实例,

    然后,单例的构造函数是私有的,外部程序如果想要访问这个单例类的话,

    必须通过 GetInstance()来请求(注意是请求)得到这个单例类的实例。

    转:http://www.cnblogs.com/BoyXiao/archive/2010/05/07/1729376.html

    学习:http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html
        

  • 相关阅读:
    使用BigQuery分析GitHub上的C#代码
    ASP.NET Core 处理 404 Not Found
    C# 7 局部函数剖析
    调试 ASP.NET Core 2.0 源代码
    Entity Framework Core Like 查询揭秘
    ASP.NET Core Razor 视图组件
    Thread 1 cannot allocate new log引起的宕机事故(转载)
    docker默认网段和主机网段冲突解决
    docker安装异常以及网络问题总结
    max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
  • 原文地址:https://www.cnblogs.com/wupeiqi/p/3152499.html
Copyright © 2020-2023  润新知