• 深入设计模式(二)——单例模式(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 单例模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收一对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。

  • 相关阅读:
    ubuntu更强大的包管理工具:aptitude
    ubuntu下载自带的java-1.8
    [机器学习] ML重要概念:梯度(Gradient)与梯度下降法(Gradient Descent)
    不能下载程序
    为什么你的电脑会变得越来越慢?
    win7常用键
    C# 遍历枚举(枚举是目的,遍历(获取)是手段)
    基于PCIe的高速接口设计
    Xilinx中的xapp1052理解
    把Xilinx的IPCORE解密成源代码的方法
  • 原文地址:https://www.cnblogs.com/xiaowuzi/p/3422168.html
Copyright © 2020-2023  润新知