設計模式面對面之單例模式
阿新 • • 發佈:2017-11-08
創建 對象 read lazy sea ado sealed 方便 image
單例模式
類圖:
常用的實現方式:
第一種線程安全
public sealed class Singleton { public static readonly Singleton SingletonInstance=new Singleton(); private Singleton() { } }View Code
第二種單線程安全
//第二種 public sealed class SingletonLazy { private staticView CodeSingletonLazy _singletonInstance; private SingletonLazy() { } //單線程,線程安全 public static SingletonLazy SingletonInstance { get { if (_singletonInstance == null) { _singletonInstance= new SingletonLazy(); } return _singletonInstance; } } }
第三種線程安全
public sealed class SingletonLazy { private static SingletonLazy _singletonInstance; private SingletonLazy() { }View Code//多線程,線程安全 private static readonly object AsyncObject = new object(); public static SingletonLazy SingletonInstanceAsync { get { if (_singletonInstance == null) { lock (AsyncObject) { if (_singletonInstance == null) { _singletonInstance = new SingletonLazy(); } } } return _singletonInstance; } } }
使用場景:
當程序要求只有一個對象存在時,會考慮用單例模式。
在使用前需要了解單例模式與靜態對象區別:
功能角度:二者可以相互替換,沒什麽區別,什麽都不考慮的情況用那種方式都行。
性能:單例對象可以延遲創建 ,優先考慮。
擴展:單例對象可以實現多態,擴展性好,靜態對象不能。
線程安全:單例對象在多線程時,要考慮線程同步,靜態對象不需要。
在不考慮性能和擴展性的時候優先用靜態對象。
單例對象的創建方式:
上面三種實現方式比較常見,當然實現方式很多,根據具體的場景去選擇,一般默認第一種,簡單方便。
設計模式面對面之單例模式