1. 程式人生 > >設計模式——3.單例模式

設計模式——3.單例模式

代碼 pre ima () IT 技術分享 key oid inf

單例模式(singleton)簡介:

單例模式保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。使用單例模式能夠讓設計師快速獲取提供某項服務或者功能的對象,可以省去層層傳遞對象的困擾。

單例模式在實現時,需要編程語言的支持,需要編程語言具有靜態類屬性、靜態類方法以及可重新定義構造函數的訪問修飾符,具有這3項語句功能的編程語言就可以實現單例模式。

單例模式結構

技術分享圖片

Singleton單例類:


    public class Singleton
    {
        private static Singleton _instance;

        private Singleton() { }

        public static Singleton Instance {
            get {
                if (_instance == null) {
                    _instance = new Singleton();
                }
                return _instance;
            }
        }

    }

其中靜態類方法Instance用來獲取_instance屬性,上方代碼使用了C#的getter存取運算符功能來實現Instance方法,使Singleton.Instance()的調用方式,寫為Singleton.Instance的方式,減少的一對括號對於後續代碼維護有著一定程度的幫助。

客戶端測試代碼:


        static void Main(string[] args)
        {
            Singleton s1 = Singleton.Instance;
            Singleton s2 = Singleton.Instance;

            if (s1 == s2 ) {
                Console.WriteLine("The only one Singleton instance .");
            }

            Console.ReadKey();
        }

或者直接使用方法方式獲取:


    public class Singleton
    {
        private static Singleton _instance;

        private Singleton() { }

        public static Singleton GetInstance()
        {
            if (_instance == null)
            {
                _instance = new Singleton();
            }
            return _instance;
        }
    }

    //使用時:
    //Singleton s = Singleton.GetInstance();

單例模式優點及缺點

優點:
單例模式通過將類的構造方法私有化,讓類對象只能夠在類的成員方法中產生,配合類的靜態成員屬性在類中只會出現一個的限制,讓系統可以有效的限制數量,因此,單例模式可以有效的限制類對象產生的地點和時間,同時也可以防止類對象被隨意產生而造成系統錯誤。

缺點:

單例模式使用方便,但是在挑選適合以單例模式實現的類時,需要認真挑選,不能夠濫用單例;其次,單例模式違反了“開閉原則”,因為通過Instance方法獲取的對象是“實現類”不是“接口類”,該方法返回的對象是包含了實現細節的實體類,當後續設計變更後者需求改變時,程序員無法將它替代為其他類,只能改變實現類中原有的程序代碼,無法滿足“對修改關閉”的要求。

設計模式——3.單例模式