• Singleton Pattern 单例模式简介与 C# 示例【创建型】【设计模式来了】



     〇、简介

    1、什么是单例模式?

    一句话解释:

      单一的类,只能自己来创建唯一的一个对象。

    单例模式(Singleton Pattern)是日常开发中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有一个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象

    官方意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

     一个比喻:(班主任与学生)

      比如一个班级,只有一个班主任,任何一个同学要找班主任,都是找的同一个,班主任忙的时候,当然就出现排队的情况。

    2、优缺点和使用场景

    • 优点:内存里只有一个实例,减少了内存的开销,也避免了对象高频创建带来的性能损耗。
    • 缺点:任务量大时,会出现排队,耗时增加。另外与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

     使用场景举例:

    • 要求生产唯一序列号。
    • WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
    • 创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

    一、单例模式简单实现

    public class Singleton
    {
    private static Singleton instance = null;
    private static object lockObject = new object();
    ///
    /// 私有化构造函数,防止外部实例化
    ///
    private Singleton() { }
    public static Singleton Instance
    {
    get
    {
    if (instance == null)
    {
    lock (lockObject) // 线程同步锁
    {
    if (instance == null) // Lazy Initialization
    {
    instance = new Singleton();
    }
    }
    }
    return instance;
    }
    }
    ///
    /// 重置 Singleton
    ///
    public void Reset()
    {
    instance = null;
    }
    }

     测试代码:

    static void Main(string[] args)
    {
    var instance1 = Singleton.Instance;
    var instance2 = Singleton.Instance;
    Console.WriteLine(instance1 == instance2); // 输出 true
    }

    二、带参数的单例模式实现

    public class SingletonParameters
    {
    private static SingletonParameters instance = null;
    private static object lockObject = new object();
    private int _firstvalue, _secondvalue;
    ///
    /// 私有化构造函数,防止外部实例化
    ///
    private SingletonParameters(int first, int second)
    {
    this._firstvalue = first;
    this._secondvalue = second;
    }
    public static SingletonParameters InstanceParameters(int first, int second)
    {
    if (instance == null)
    {
    lock (lockObject) // 线程同步锁
    {
    if (instance == null) // Lazy Initialization
    {
    instance = new SingletonParameters(first, second);
    }
    }
    }
    else
    {
    instance.FirstValue = first;
    instance.SecondValue = second;
    }
    return instance;
    }
    public int FirstValue { get { return _firstvalue; } set { _firstvalue = value; } }
    public int SecondValue { get { return _secondvalue; } set { _secondvalue = value; } }
    ///
    /// 重置 Singleton
    ///
    public void Reset()
    {
    instance = null;
    }
    }

     测试代码:

    var instance1 = SingletonParameters.InstanceParameters(1, 2);
    Console.WriteLine($"FirstValue:{instance1.FirstValue}");
    Console.WriteLine($"SecondValue:{instance1.SecondValue}");
    var instance2 = SingletonParameters.InstanceParameters(3, 4);
    Console.WriteLine($"FirstValue:{instance2.FirstValue}");
    Console.WriteLine($"SecondValue:{instance2.SecondValue}");
    Console.WriteLine($"instance1 == instance2 : {instance1 == instance2}");

     

    参考:https://www.cnblogs.com/gaochundong/p/design_pattern_singleton.html

    三、在 .NET 框架中的实际应用

    下边是通过 object.GetType() 方法,获取对象的类型:

    var test1 = new TestClass();
    var test2 = new TestClass();
    Type t1 = test1.GetType();
    Type t2 = test2.GetType();
    Console.WriteLine($"t1 == t2 : {t1 == t2}"); // t1 == t2 : True

    根据以上示例,t1、t2 指向的是同一个对象,因此 object.GetType() 针对同一类型只生成一个 Type 对象。

  • 相关阅读:
    string类
    C++ Tutorials: C++ Language: Other language features: Preprocessor directives
    【python】(四)python常用数据结构
    泛微OA建模查询中自定义按钮弹出自定义对话框+调用新建表单卡片中的保存功能
    安装 ADB 工具步骤以及基本使用
    Oracle/PLSQL: Replace Function
    php志愿者协会报名系统的设计与实现毕业设计源码201524
    底层驱动。
    【面试题】金九银十,你准备好面试了吗? (30w字前端面试题总结)( React)
    DSPE-PEG-T7(HAIYPRH) PEG:2000 转铁蛋白靶向肽标记PEG化磷脂
  • 原文地址:https://www.cnblogs.com/czzj/p/SJMSLL_Singleton.html