單例模式
作為對象的建立模式,單例模式確定某一類隻有一個執行個體,而且自行執行個體化并向整個系統提供這個執行個體,這個類稱為單例類。單例類的一個重要特點是它的構造方法是私有的,且此類不能被繼承。它有如下幾種結構:
1、餓漢式
餓漢式單例類是當這個類被加載時就被執行個體化
餓漢式單例類可以在java語言裡實作,不易在c++内實作,因為靜态初始化在c++裡沒有固定的順序,因而靜态的eagerinstance變量初始化與類的加載順序沒有保證,這更符合java語言的特點。
2、懶漢式
與餓漢式單例類不同的是,懶漢式單例類在第一次被引用時才将自己執行個體化。
上面給出懶漢式單例類實作裡對靜态方法使用了同步化,以适應多線程環境。
3、登記式
登記式單例類是為了克服上面兩種單例類均不能被繼承的缺點而設計的,它的子類執行個體化的方式隻能是懶漢式的。
它的子類regsingletonchild需要父類的幫助才能執行個體化,示例代碼如下:
本例中加入了getinstance()方法,好處是regsingletonchild可以通過這個方法傳回自己的執行個體,缺點是由于資料類型不同,無法在regsingleton提供這樣一個方法。
登記式單例類的缺點:由于子類必須允許父類以構造方法産生執行個體,是以它的構造方法必須是公開的,這等于允許了以這種方式産生執行個體而不在父類的登記中;由于父類的執行個體必須存在才可能有子類的執行個體,這在有些情況下是種浪費。