參考筆記:深入理解Java設計模式:單例模式及其餓漢式與懶漢式的對比,-CSDN博客
目錄
1.什么是設計模式
2.經典設計模式
3.單例設計模式(static屬性/方法經典使用場景 )
3.1?餓漢式單例模式
3.2 懶漢式單例模式
4.補充
1.什么是設計模式
設計模式是在大量的實踐中總結和理論化之后優的代碼結構、編程風格、以及解決問題的思考方式
2.經典設計模式
經典的設計模式共 23 種?
① 創建型模式,共 5 種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式
② 結構性模式,共 7 種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式
③?行為型模式,共 11 種:策略模式、模板方法模式、觀察者模式、迭代器模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式
3.單例設計模式(static屬性/方法經典使用場景 )
單例設計模式:采取一定的方法保證在整個軟件系統中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法
單例設計模式主要有以下三個特點:
① 只能有一個實例
② 必須自己創建自己的唯一實例?
③ 必須給所有其他對象提供這一實例
3.1?餓漢式單例模式
① 特點:立即加載,類加載時就會把 single 創建完畢
②?優點:實現簡單,不會有多線程安全問題
③?缺點:當類加載時,會初始化 static 變量,靜態變量被創建并分配內存空間。從這以后,這個 sttaic 的實例便一直占著這塊內存,直到類被卸載時,靜態變量被銷毀,并解釋所占用的內存空間。因此餓漢式單例模式在特定條件下會耗費內存
public class Test {public static void main(String[] args) {Singleton single1 = Singleton.getInstance();Singleton single2 = Singleton.getInstance();System.out.println(single1==single2);//trueSystem.out.println(single1);System.out.println(single2);}
}//餓漢式單例模式
class Singleton {private String name;// 1.私有化構造器,防止直接在其他類new對象private Singleton(String name) {this.name = name;}// 2.內部提供一個當前類的實例// 4.為了能夠在靜態方法getInstance中返回變量,single也必須靜態化(靜態方法只能調用靜態屬性/方法)private static Singleton single = new Singleton("小馬");// 3.提供公共的靜態的方法,返回當前類的對象public static Singleton getInstance() {return single;}@Overridepublic String toString() {return "Singleton{" +"name='" + name + '\'' +'}';}
}
3.2 懶漢式單例模式
先看代碼,后面再總結
public class Test {public static void main(String[] args) {//single1和single2是同一對象Singleton single1 = Singleton.getInstance();Singleton single2 = Singleton.getInstance();System.out.println(single1==single2);//trueSystem.out.println(single1);System.out.println(single2);}
}//懶漢式單例模式
class Singleton {// 1.私有化構造器private Singleton() {}// 2.內部提供一個當前類的實例// 4.此實例也必須靜態化private static Singleton single;// 3.提供公共的靜態的方法,返回當前類的對象public static Singleton getInstance() {if(single == null) {single = new Singleton();}return single;}
}
/*輸出結果
true
Singleton@1b6d3586
Singleton@1b6d3586
*/
① 特點:延遲加載,只有在調用靜態方法 getInstance 時 single 才被分配內存空間
②?優點:實現簡單
? ? (1)餓漢式在類加載時就創建了對象實例,但是可能這個對象后面沒有用或者用的少,就造成浪費;
? ? (2)懶漢式在類加載時?static 實例未被創建和分配內存空間,只有當靜態方法 getInstance 第一次被調用時才返回對象,再次調用時,返回的也是上次調用的對象,因此保證了僅一個實例對象
③?缺點:在多線程環境中,該實現方法存在線程安全問題,不能保證單例的唯一性
說明:?3 個線程同時進入 if 語句中,new 了 3 次,破環了單例設計模式的原則?
4.補充
JavaSE 類庫中,java.lang.Runtime 就是經典的單例模式,且是餓漢式的?