1.單例模式:
這種模式涉及到一個單一的類,該類負責創建自己的物件,同時確保只有單個物件創建,這個類提供一種訪問方式訪問其唯一的物件的方式,
可以直接訪問,不需要實體化該類物件,
2.特點:
1.單例類只能有一個實體,
2.單例類必須自己創建自己的唯一實體,
3.單例類必須給所有其他物件提供這一實體,
3.實作方法:
許多人可能值記得懶漢式和餓漢式,但是最好盡可能全記住,不然面試官問你還有沒有其他的那就啞然了,
(1)懶漢式:執行緒不安全,加鎖會影響效率
1 public class LSingle { 2 private static LSingle single; 3 //私有的無參構造器一定要存在:不想用別人用new的方法創建物件 4 private LSingle() {} 5 //加鎖解決執行緒不安全問題但是影響效率 6 public static /*synchronized*/ LSingle getSingle() { 7 if(single==null)single = new LSingle(); 8 return single; 9 }10 11 }
(2)餓漢式:執行緒安全,在類加載中初始化,浪費記憶體
1 public class ESingle {2 private static ESingle single = new ESingle();3 //必須存在私有構造器4 private ESingle() {}5 public static ESingle getSingle() {6 return single;7 }8 9 }
(3)雙重校驗鎖:采用雙鎖機制,安全且在多執行緒的情況下保持高性能,但是不易實作
1 public class DoubleLockSingle { 2 private static DoubleLockSingle single; 3 //必須存在私有構造器 4 private DoubleLockSingle() {} 5 public static DoubleLockSingle getSingle() { 6 if(single==null) { 7 synchronized(DoubleLockSingle.class) { 8 if(single==null) { 9 single = new DoubleLockSingle();10 }11 }12 }13 return single;14 }15 16 }
(4)靜態內部類/登記式:執行緒安全,和雙鎖機制效果一樣,實作更簡單,只是有于靜態域
public class StaticSingle { private static class InnerSingle{ //常量:直接呼叫 private static final StaticSingle single = new StaticSingle(); } public static StaticSingle getSingle() { return InnerSingle.single; }}
(5)列舉:執行緒安全,實作容易,是實作單例模式的最佳方法,支持自動系列化機制防止多次序列化,但是使用的少
1 //列舉類2 public enum EnumSingle {3 single;4 public void whateverMethod() { 5 } 6 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/44337.html
標籤:設計模式
上一篇:觀察者模式,從公眾號群發說起
下一篇:設計模式-結構型-代理模式
