• C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)


    一:模式分类

    从目的来看:

    创建型(Creational)模式:负责对象创建。

    结构型(Structural)模式:处理类与对象间的组合。

    行为型(Behavioral)模式:类与对象交互中的职责分配。

    从范围来看:

    类模式处理类与子类的静态关系。

    对象模式处理对象间的动态关系。

    二:Singleton (创建型模式) 单件

    1.动机(Motivation

    软件系统中,经常有这样一些特殊的类,必须保证他们在系统中只存在一个实例,才能确保它们的逻辑正确性,以及良好的效率。

    如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例 ?

    这应该是类设计者的责任,而不是使用者的责任。

    2.意图(Intent

    保证一个类仅有一个实例,并提供一个该实例的全局访问点。   ——《设计模式》 GOF

    3.结构(Structure

     

    三:实现

    1.单线程Singleton模式实现

    1.2单线程Singleton几个要点:

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

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

    Singleton模式一般不要支持序列化,因为这可能导致多个实例对象,与Singleton模式初衷违背。

    Singleton模式只考虑对象创建的管理,没有考虑对象销毁的管理,就支持垃圾回收的平台和对象的开销来讲,我们没有必要对其销毁进行管理特殊管理。

    不能应对多线程情况,在多线程环境下仍有可能出现多个对象实例。

     public class MySigleton_SingleProcess
        {
            private static MySigleton_SingleProcess instance;
    
            private MySigleton_SingleProcess() { }
    
            public static MySigleton_SingleProcess GetMySingletonInstance()
            { 
                if(instance==null){
                    instance = new MySigleton_SingleProcess();
                }
                return instance;
            }
        }
    

      

    2.多线程Singleton模式实现

        public class MySigleton_MultiProcess
        {
            private static MySigleton_MultiProcess instance;
    
            private static readonly object lockHelper=new object();
    
            private MySigleton_MultiProcess() { }
    
            public static MySigleton_MultiProcess GetMySingletonInstance()
            {
                if (instance == null)
                {
                    lock (lockHelper)
                    {
                        //double check 预防代码编译的时候作出优化调整了代码执行顺序
                        if (instance == null)
                        {
                            instance = new MySigleton_MultiProcess();
                        }
                    }
                   
                }
                return instance;
            }
        }

    3.使用.NET初始化机制实现多线程Singleton模式

      public  class Singleton
        {
            private static readonly Singleton _instance = new Singleton();
    
            // Explicit static constructor to tell C# compiler
            // not to mark type as beforefieldinit
            static Singleton()
            {
            }
    
            /// <summary>
            /// Prevents a default instance of the 
            /// <see cref="Singleton"/> class from being created.
            /// </summary>
            private Singleton()
            {
            }
    
            /// <summary>
            /// Gets the instance.
            /// </summary>
            public static Singleton Instance
            {
                get
                {
                    return _instance;
                }
            }
        }

    4.Singleton 模式扩展

     将一个实例扩展到多个实例,比如对象池的实现。

    New构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。

    Singleton 模式核心是“如何控制用户使用new对一个类的实例构造器的任意调用”。

    5. .NET框架中Singleton模式的应用

    Object 基类中的 GetType() 。

  • 相关阅读:
    在AS/400上根据日期生成星期几
    如何删除含无效字符的文件
    在CL中使用SST或者SUBSTRING
    取网络属性
    如何在程序中获取系统ASP使用率等系统状态信息
    在CL中使用ELSE
    在CL中读一个文件
    如何在FTP命令行执行AS/400命令
    广告悬停功能
    关于Grouping, Rollup,cube,
  • 原文地址:https://www.cnblogs.com/ProgrammerGE/p/4850542.html
Copyright © 2020-2023  润新知