設計模式之略見一斑 單例模式singleton

2021-08-25 01:44:52 字數 1538 閱讀 8691

單例模式是屬於比較常用的一例,乙個類(class)在記憶體中只有乙個例項。

常用方式如下:

第一種(餓漢式):

public class singleton

//在自己內部定義自己乙個例項,是不是很奇怪?

//注意這是private 只供內部呼叫

private static singleton instance = new singleton();

//這裡提供了乙個供外部訪問本class的靜態方法,可以直接訪問  

public static singleton getinstance()

}

第二種方式:(懶漢式)

public class singleton

}

比較安全的使用方式是第一種private static singleton instance = new singleton();

單例的陷井:

多個虛擬機器

當單例類被執行在多個虛擬機器下的時候,在每個虛擬機器都可以建立乙個例項對歇腳。像使用了ejb,jini,rmi技術的分布式系統的時候,因為中介軟體遮蔽了分布式系統在物理上的差異,這個時候想知道在哪個虛擬機器下執行著哪個單例物件很困難。因此在使用分布式技術時,應該避免使用

多個類載入器

在這種情況,由狀態的單例模式也會給系統帶來隱患。因此除非系統由協調機制,在一般情況下不要使用存在狀態的單例模式。

錯誤的同步處理

在使用上面介紹的懶漢式單模式的時候,同步得理恰當與否也是很,不然要能達不到想要的單例效果,還可能引發死鎖等。因此在使用懶漢式單例模式時一定要對同步有所了解,不過使用餓漢式單例模式就可以避免這個問題。

子類破壞了物件控制

如果構造器變得不再私有,就有可能失去對物件的控制

序列化(可序列化)

為了使乙個單例類變成可序列化的,僅僅在宣告中新增「implements serializable"是不夠的,因為乙個序列化的物件在每次反序列化的時候,都會建立乙個新的物件,而不僅僅是乙個對原有物件的引用,為了防止這種情況,可以在單例類中加入readresolve方法

public final class singleton implements serializable

private static final singleton instance = new singleton ();

public static singleton getinstance()

private object readresolve() throws objectstreamexception

}

物件的反序列化並不僅侷限於上述方式,還存在基於 xml模式的物件序列化方式,這種方式也存在上述的問題,所以在使用的時候還要格外小心。

原文:

設計模式之略見一斑 外觀模式Facade

外觀模式又稱門面模式,它是為了給子系統中提供乙個一致的介面,從面定義了乙個高層介面 這個介面使得這一子系統更加容易使用。定義中提到的子系統指在設計中為了降低複雜性根據一定的規則,對系統進行的劃分,子系統封裝有一些類,客戶程式在使用子系統的時候,可能會像下圖一樣零亂。上面的實現中,客戶緊緊依賴在子系統...

設計模式之略見一斑 建造模式builder

建造模式是將複雜的內部建立封裝在內部,對於外部呼叫的人來說,只需要傳入建造者和建造工具,對於內部是如何建造成成品的,呼叫者無需關心。建造模式很象抽象工廠模式,細微的區別的大概只有在反覆使用的方能體會。舉個簡單的例子,如汽車,有很多部件,車輪,方向盤,發動機還有各種小零件等等,部件很多,但遠不止這些,...

設計模式之略見一斑 建造模式builder

建造模式是將複雜的內部建立封裝在內部,對於外部呼叫的人來說,只需要傳入建造者和建造工具,對於內部是如何建造成成品的,呼叫者無需關心。建造模式很象抽象工廠模式,細微的區別的大概只有在反覆使用的方能體會。舉個簡單的例子,如汽車,有很多部件,車輪,方向盤,發動機還有各種小零件等等,部件很多,但遠不止這些,...