23種設計模式(一)單例模式

2022-09-09 21:54:31 字數 2696 閱讀 8178

概念:

優點:缺點:

實現單例模式最關鍵的步驟就是構造器私有

/**

* 單例模式是最常見的一種設計模式

* 它有以下特點

* 1、單例類只能有乙個例項

* 2、單例類必須自己建立自己的唯一例項

* 3、單例類必須給所有其他對線提供這一例項

* * 餓漢式單例模式

* 餓漢式的特點就在於

* 在類建立的同時就建立好了乙個靜態的物件供系統使用

* 以後不會再改變,所以天生就是執行緒安全的

* 但是這會造成記憶體的浪費

* @author kimariyb

*/public class hungryman

public static hungryman getinstance()

}

餓漢式單例無疑是最簡單的,最容易實現的一種模式了

1.2.1 執行緒不安全的

​ 執行緒不安全的懶漢式是最基本的實現方式,它最大的問題就在於不支援多執行緒安全。它在多執行緒下是不能工作的。

/**

* 懶漢式單例

* 懶漢式的特點就在於

* 它不會造成記憶體的浪費

* 但是它會帶來多執行緒安全的問題

* @author kimariyb

*/public class lazymanunsafe

public static lazymanunsafe getinstance()

return lazymanunsafe;}}

1.2.2 執行緒安全的

​ 在原來的**基礎上加上關鍵字synchronized才能保證單例,這使得多執行緒安全得到保障。但是會影響效率。

/**

* 這是一種執行緒安全的懶漢式

* 它主要的原理就在於

* 加上了鎖 synchronized

* 能在多執行緒中工作,但是這降低了效率

* @author kimariyb

*/public class lazymansafe

public static synchronized lazymansafe getinstance()

return lazymansafe;}}

​ 這是一種能在多執行緒下執行並且高效能的單例模式

/**

* 雙重檢測(dcl)

* dcl 模式下最重要的莫過於 volatile 關鍵字

* 它會解決指令重排的問題

* @author kimariyb

*/public class doublecheck

public static doublecheck getinstance() }}

return doublecheck;}}

所謂的原子性操作指的是所處的層(layer)的更高層不能發現其內部實現與結構。原子操作可以是乙個步驟,也可以是多個操作步驟,但是其順序不可以被打亂,也不可以被切割而只執行其中的一部分。

​ 這種方式能達到雙檢鎖方式一樣的功效,但實現更簡單。對靜態域使用延遲初始化,應使用這種方式而不是雙檢鎖方式。這種方式只適用於靜態域的情況,雙檢鎖方式可在例項域需要延遲初始化時使用。

/**

* 靜態內部類

* 在內部類中宣告物件

* @author kimariyb

*/public class staticholder

private static class holderclass

public static staticholder getinstance()

}

​ 在說明列舉如何實現之前,我們應該思考,為什麼列舉能夠實現單例模式,這樣做的優點在**。

1.5.1 使用反射破壞單例

​ 在 j**a 中反射是乙個很強大的功能,毫不誇張的講,反射是萬能的。

public static void main(string args) throws exception
​ 輸出結果如下:

根據雜湊值,我們很清楚的看見單例模式被破壞了!

1.5.2 使用列舉避免被反射破壞

​ 使用列舉來避免反射被破壞的原理,我們可以在 j**a 原始碼中窺見一二。我們找到newinstance()方法的原始碼,可以看見一行 "cannot reflectively create enum objects"。

* 列舉類

* 列舉本身也是乙個 class

* * @author kimariyb

*/public enum enumsingle

}

23種設計模式 單例模式

某些情況,如 執行緒池,乙個專案中匯流排程數量以及生命週期,可能需要統一控制 如果執行緒池自身可建立多個例項,那麼就無法統一控制,此時,只要能控制線程池物件的數量為乙個,那麼就可以實現統一控制的目標 注意 現實中真正使用純的單例模式並不多 如 spring bean 通過配置來決定是否使用單例 執行...

單例模式(23種設計模式)

單例模式 餓漢模式 class singletondemo public static singletondemo gets 懶漢模式 class singletondemo1 public static singletondemo1 gets return instance 單例模式,懶漢式,執行...

23種設計模式 單例模式

單例模式需要保證,構造方法一定是私有化的,並且類的全域性變數必須是靜態的,私有的 這樣才能有唯一的例項化途徑 錯誤 一 public class singleton public static singleton getinstance 上述方法,並沒有把類變數singleton設定為靜態的,這樣,...