这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
实现思路: 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(); }); }