'單例模式-個人理解'

Java Java虛擬機 設計模式 LovelyPig 2019-08-24
"

單例模式

  • 單例模式(Singleton Pattern)是Java中最簡單的設計模式之一。屬於創建型模式,(單例模式、工廠方法模式、抽象工廠模式、建造者模式、原型模式),它提供了一種創建對象的最佳方式。這種模式涉及到單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。
  • 總結:
  • 單例類只能有一個實例。
  • 單例類必須自己創建自己的唯一實例。
  • 單例類必須給所有其他對象提供這一實例。

我知道的6中創建單例的方法:

/**
* 懶漢式:第一次使用實例時才會真正意義上的創建對象
* 節約資源,但是性能低下
*/
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {
}
/**
* 這種線程不安全
*/
// public static LazySingleton getInstance() {
// if (instance == null) {
// instance = new LazySingleton();
// }
// return instance;
// }
/**
* 懶漢式:第一次使用實例時才會真正意義上的創建對象
* 節約資源,但是性能低下
*/
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {
}
/**
* 懶漢式線程安全,就是加了方法鎖
*/
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
/**
* 餓漢式:jvm運行直接加載,初始化實例
* 容易產生實例垃圾,浪費資源
*/
public class HungrySingleton {
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getInstance() {
return instance;
}
}
/**
* 雙重檢查機制:double-checked locking:線程安全下保證性能
*/
public class DCL {
private volatile static DCL instance;
private DCL() {
}
public static DCL getInstance() {
if (instance == null) {
synchronized (DCL.class) {
if (instance == null) {
instance = new DCL();
}
}
}
return instance;
}
/**
* 登記式/靜態內部類:可以達到DCl的效果,但是實現更簡單。
* 它使用的是對靜態域的延遲加載,而不是使用雙檢鎖方式。
* 他適合使用在靜態域的情況,如果是在實例域需要延遲加載,可以使用延遲加載。
*/
public class RegistrationSingleton {
// 創建靜態域
private static class StaticField {
// 初始化獲取實例
private static final RegistrationSingleton INSTANCE = new RegistrationSingleton();
}
private RegistrationSingleton() {
}
public static final RegistrationSingleton getInstance() {
return StaticField.INSTANCE;
}
/**
* 枚舉反式:這是實現單例模式的最佳方法。它更簡潔,自動支持序列化機制,絕對防止多次實例化。
* 這種方式是 Effective Java 作者 Josh Bloch 提倡的方式,
* 它不僅能避免多線程同步問題,而且還自動支持序列化機制,防止反序列化重新創建新的對象,絕對防止多次實例化。
*/
public enum EnumSingleton {
INSTANCE;
public void whateverMethod() {
}
}
"

相關推薦

推薦中...