设计模式(C#实现)--单例模式(多种实现方式)

    技术2022-07-11  104

    这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

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

    实现思路: 1:私有化构造方法 2:暴露创建对象的方法 3:存储创建的对象

    方法1:

    public static SingletonClass _singleton = null; public static readonly object lockObj = new object(); public void Show() { Console.WriteLine("Singleton............"); } public static SingletonClass GetInstance() { if (_singleton == null) { _singleton = new SingletonClass(); } } private SingletonClass() { var IResult = 0L; for (int i = 0; i < 1000000; i++) { IResult += i; } Thread.Sleep(1000); Console.WriteLine("SingletonClass被构造。。。。。。。"); }

    调用:

    for (int i = 0; i < 10; i++) { SingletonClass singleton = SingletonClass.GetInstance(); singleton.Show(); }

    这种方式在非多线程下是可以达到目的,但是在多线程下就会出现下面的结果:

    for (int i = 0; i < 5; i++) {   Task.Run(() => { SingletonClass singleton = SingletonClass.GetInstance(); singleton.Show(); });  }

    解决方式 :双重if加锁

    if (_singleton == null) { lock (lockObj) { if (_singleton == null)//不多余 { _singleton = new SingletonClass(); } } }

    方法3: 使用静态构造函数或者静态字段

    public sealed class SingletonSecClass { public static SingletonSecClass _singletonSec = null; //静态字段 // public static SingletonSecClass _singletonSec =new SingletonSecClass(); private SingletonSecClass() { var IResult = 0L; for (int i = 0; i < 1000000; i++) { IResult += i; } Thread.Sleep(1000); Console.WriteLine("SingletonSecClass被构造。。。。。。。"); } static SingletonSecClass() { _singletonSec = new SingletonSecClass(); } public static SingletonSecClass GetInstance() { return _singletonSec; } public void Show() { Console.WriteLine("Singleton............"); } } for (int i = 0; i < 5; i++) { Task.Run(() => { SingletonSecClass singletonSec = SingletonSecClass.GetInstance(); singletonSec.Show(); }); }

    Processed: 0.015, SQL: 9