1. 程式人生 > >設計模式面對面之單例模式

設計模式面對面之單例模式

創建 對象 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 static
SingletonLazy _singletonInstance; private SingletonLazy() { } //單線程,線程安全 public static SingletonLazy SingletonInstance { get { if (_singletonInstance == null) { _singletonInstance
= new SingletonLazy(); } return _singletonInstance; } } }
View Code

第三種線程安全

技術分享
 public sealed class SingletonLazy
    {
       
        private static SingletonLazy _singletonInstance;

        private SingletonLazy()
        {

        }

        
//多線程,線程安全 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; } } }
View Code

使用場景:

當程序要求只有一個對象存在時,會考慮用單例模式。

在使用前需要了解單例模式與靜態對象區別:

功能角度:二者可以相互替換,沒什麽區別,什麽都不考慮的情況用那種方式都行。

性能:單例對象可以延遲創建 ,優先考慮。

擴展:單例對象可以實現多態,擴展性好,靜態對象不能。

線程安全:單例對象在多線程時,要考慮線程同步,靜態對象不需要。

在不考慮性能和擴展性的時候優先用靜態對象。

單例對象的創建方式:

上面三種實現方式比較常見,當然實現方式很多,根據具體的場景去選擇,一般默認第一種,簡單方便。

設計模式面對面之單例模式