設計模式系列 搞懂單例模式,我獨一無二

2021-10-22 13:53:59 字數 1980 閱讀 7481

單例模式的定義:乙個類只有乙個例項,且該類能自行建立這個例項,並提供乙個訪問該單例的全域性訪問點。屬於建造型模式。

單例模式的實現:

餓漢式單例:類載入的時候即初始化並建立單例物件。適用於單例物件較少的情況。

public class hungrysingleton 

public static hungrysingleton getinstance()

}//使用靜態**塊實現單例

public class hungrysingleton

private hungrysingleton(){}

public static hungrysingleton getinstance()

}

懶漢式單例:類載入時沒有生成單例,只有當第一次呼叫 getlnstance 方法時才去建立這個單例。

public class lazysingleton 

public static synchronized lazysingleton getinstance()

return instance;

}}

訪問執行緒較多時,上面synchronized加鎖的方式會造成大量執行緒阻塞,導致程式效能下降。

優化後使用雙重檢查鎖的單例模式實現:

public class lazysingleton 

public static lazysingleton getinstance()}}

return instance;

}}

從類初始化的角度,不使用synchronized加鎖,使用靜態內部類的方式實現單列:

public class lazysingleton 

public static final lazysingleton getinstance()

private static class lazyholder

}

上面的單例實現可以通過使用反射或序列化的方式破壞單例結構。

為了防止反射破壞單例,構造方法中需要加一些限制。

public class lazysingleton 

}public static final lazysingleton getinstance()

private static class lazyholder

}

在序列化的情況下實現單例需要增加readresolve()方法。

public class hungrysingleton 

public static hungrysingleton getinstance()

private object readresolve()

}

註冊式單例模式:將所有例項進行登記,使用唯一標識獲取例項。分為列舉式單例和容器式單例。

列舉式單例:列舉型別在靜態**塊中賦值,只載入一次,所以是單例的。

public enum enumsingleton 

public object getdata()

public void setdata(object data)

}

容器式單例:適用於需要建立大量單例物件的場景,但不是執行緒安全的。

public class containersingleton 

private static mapioc = new concurrenthashmap<>();

public static object getbean(string classname) throws classnotfoundexception, illegalacces***ception, instantiationexception else }}

}

單例模式的優點:

單例模式的缺點:

設計模式系列一 單例模式

單例模式 主要用於保證乙個類只有乙個例項,對外提供乙個全域性的訪問點來獲取該例項。是所有設計模式中最簡單的模式。實現 c using system using system.collections.generic using system.linq using system.text namespa...

設計模式系列 單例模式

單例模式 確保乙個類只有乙個例項,並提供乙個全域性訪問點。什麼情況下需要單例模式?一些類提供公共功能供別人呼叫,本身不會處理業務邏輯 類會被許多類和執行緒呼叫 單例模式的一些注意點 單例的生存期超長,會導致記憶體的持續占用。單例在多執行緒環境需要小心的處理執行緒互斥,進行資源保護。單例在類的繼承樹中...

設計模式系列 單例模式

單例模式就是指單例類在一定的生命週期內只能有乙個物件例項,單例類的建立必須是本身,並能給使用者提供自身。在現實世界中,每個生命體都可以被看做是乙個單例物件,唯一且具體,具有不可複製性。同樣的,在軟體開發領域中,有時我們需要保證客戶端在當前的客戶機上只能執行乙個例項這個時候,我們就應該考慮使用單例模式...