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

2022-08-21 20:18:10 字數 1640 閱讀 6636

1、問題猜想,假如將乙個物件通過序列化放到乙個檔案後,再取出來看是否與本身相等?

public

class hungrysingleton implements

serializable

private

hungrysingleton()

public

static

hungrysingleton getinstance()

}

public

class

test

}

結果:

com.wenwen.design.pattern.creational.singleton.hungrysingleton@45ee12a7

com.wenwen.design.pattern.creational.singleton.hungrysingleton@7699a589

false

由此可見,instance和newinstance不相等,就違背了單例模式的乙個初衷,通過序列化和反序列化拿到了不同的物件。而我們是希望拿到乙個物件。

那麼如何解決呢?

在單例中加乙個方法就可解決,如下**所示:

public

class hungrysingleton implements

serializable

private

hungrysingleton()

public

static

hungrysingleton getinstance()

private

object readresolve()

}

再次執行測試類之後,結果如下:

com.wenwen.design.pattern.creational.singleton.hungrysingleton@45ee12a7

com.wenwen.design.pattern.creational.singleton.hungrysingleton@45ee12a7

true

為什麼如此神奇呢?這就要大家深入看下原始碼了。按command+enter進行該處的原始碼。

因為使用了序列化,則會new乙個新的例項,所以前面看到會返回兩個不同的例項。

因為**裡寫了readresolve()方法,會反射出原先的例項進行返回,則寫了readresolve()方法之後,會返回同乙個例項。

單例模式5 1(序列化破壞單例)

之前見過可以通過反射來破壞單例,和如何防止被破壞。今天講一下序列化破壞單例。新建類 serializablesingletion,其實就是餓漢式單例,只是實現了serializable介面 public class serializablesingletion implements serializ...

單例模式,解決單例破壞。

破壞單例模式的三種方法 執行緒安全情況下 單例模式有 3 個特點 單例類只有乙個例項物件 該單例物件必須由單例類自行建立 單例類對外提供乙個訪問該單例的全域性訪問點。單例模式的優點和缺點 單例模式的優點 單例模式可以保證記憶體裡只有乙個例項,減少了記憶體的開銷。可以避免對資源的多重占用。單例模式設定...

單例模式及單例物件的可序列化

為了使乙個單例類變成可序列化的,僅僅在宣告中新增 implements serializable 是不夠的。因為乙個序列化的物件在每次返序列化的時候,都會建立乙個新的物件,而不僅僅是乙個對原有物件的引用。為了防止這種情況,可以在單例類中加入readresolve 方法。下面我們先簡要地回顧下物件的序...