建立者模式 單例模式 反射 序列化

2022-02-02 09:05:14 字數 2059 閱讀 5252

實現方式:(構造器私有,提供乙個外部可以訪問的方法(可以提供例項)

1、餓漢式:執行緒安全,呼叫效率高, 不能延時載入

2、懶漢式:執行緒安全,呼叫效率不高,可以延時載入(要用的時候才載入  )

3、雙重鎖檢測式:「由於jvm底層內部模型原因,偶爾會出現問題,不建議使用」

4、靜態內部類式:執行緒安全,呼叫效率高,且可以實現延時載入

(上面的四種方式都可以通過反射和反序列化 破壞 單例模式)

5、列舉:執行緒安全,呼叫效率高,不能延時載入,可以天然的防止反射和反序列化

如果單例物件占用資源少,不需要延時載入:

列舉式 優於 餓漢式

如果單例物件占用資源大, 需要延時載入:

靜態內部類式 優於 懶漢式 

餓漢式:

/*

餓漢式: 最開始就已經把例項給建立好了 */

public

class

singleton01

public

static singleton01 getinstance()

}

懶漢式:

/*

懶漢式: 用的時候才會初始化例項 效率不高就是因為有synchronized這個關鍵字 */

public

class

singleton02

public staticsynchronizedsingleton02 getinstance()

return

instance;

}}

靜態內部類:

/*

靜態內部類: 只有在主動呼叫這個類的時候才會載入 外部類載入的時候 靜態內部類不會載入 */

public

class

singleton03

private

singleton03()

public

static singleton03 getinstance()

}

列舉:

/*

列舉 天然的可以防止 反射和反序列化 */

public

enum

singleton04

}

通過反射破壞單例模式:

public

class

test01

}

如何破壞反射:

public

class

singleton01

else}}

public

singleton01 getinstance()

}

在用反射就會報錯....

通過反序列化破壞單例模式:

物件序列化:將物件狀態轉換為位元組流的過程,可以將其儲存到磁碟檔案中或者通過網路傳送到任何其他程式中。

反序列化:將位元組流轉化為物件的過程。

public

class

test01

}

防止反序列化:

public

class singleton01 implements

serializable

public

static

singleton01 getinstance()

//在反序列化的時候 直接呼叫這個方法 返回instance 而不是返回反序列化後的新物件

private object readresolve() throws

objectstreamexception

}

建立者模式 單例模式(Singleton)(1)

1.描述 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。2.單例模式主要有3個特點,2.1 單例類確保自己只有乙個例項。2.2 單例類必須自己建立自己的例項。2.3 單例類必須為其他物件提供唯一的例項。3.實現方式 懶漢單例類 和 餓漢單例類 另參見3.1 懶漢式單例類 對於懶漢模式,我們...

單例設計模式 序列化破壞單例模式?

1 問題猜想,假如將乙個物件通過序列化放到乙個檔案後,再取出來看是否與本身相等?public class hungrysingleton implements serializable private hungrysingleton public static hungrysingleton get...

建立者模式

當我們使用抽象工廠時,在客戶端進行呼叫的時候,如果產品的類別比較多,那麼此時工廠返回的例項物件將會很多。客戶端得 將會大大增加,這將不利於程式的可讀性。為了解決此類問題,可以把所有例項的建立放在乙個類中去生成,這樣在客戶端只需要呼叫這個建立者類,大大減少客戶端的 量。1,所有動物類的介面 packa...