深入设计模式(二)——单例模式(Singleton Pattern)

   一、单例模式介绍

     单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点。单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它。

   二、解决问题

   当一个类只允许创建一个实例时,可以考虑使用单例模式。      

   三、单例模式分析(Analysis

 1.代码

 单例模式类 Singleton:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 单例模式
{
    public class Singleton
    {
        private static Singleton instance;

        /// <summary>
        /// 程序运行时,创建一个静态只读的进程辅助对象
        /// </summary>
        private static readonly object _object = new object();

        /// <summary>
        /// 构造方法私有,外键不能通过New类实例化此类
        /// </summary>
        private Singleton() { }

        /// <summary>
        /// 此方法是本类实例的唯一全局访问点
        /// (双重加锁)
        /// </summary>
        /// <returns></returns>
        public static Singleton GetInstance()
        {
            //先判断实例是否存在,不存在再加锁处理
            if (instance == null)
            {
                //在同一时刻加了锁的那部分程序只有一个线程可以进入
                lock (_object)
                {
                    //如实例不存在,则New一个新实例,否则返回已有实例
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}

客服端代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 单例模式
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
             一、单例模式简介(Brief Introduction)

            单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点。单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它。
             
            二、解决的问题(What To Solve)

            当一个类只允许创建一个实例时,可以考虑使用单例模式。  
             * 
             */

            Singleton singleton1 = Singleton.GetInstance();

            Singleton singleton2 = Singleton.GetInstance();

            if (singleton1 == singleton2)
            {

                Console.WriteLine("实例singleton1与实例singleton2相同!");

            }

            Console.ReadKey();
        }
    }
}

    2.运行结果

     

    3.注意

      3.1 单例模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与单例模式初衷违背。

      3.2 单例模式中的实例构造器可以设置为protected以允许类派生。

      3.3 单例模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与单例模式的初衷违背。

      3.4 单例模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收一对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。

原文地址:https://www.cnblogs.com/xiaowuzi/p/3422168.html