Java的單例模式——有C++基礎的Java入門(五)
阿新 • • 發佈:2018-11-01
目錄
什麼是單例模式(Singleton)?
設計模式:Java中,一共有23種設計模式,說白了就是比較牛的程式碼設計思想。單例模式裡面非常簡單的一種。
比如說windows的桌面回收站,只能開啟這麼一個回收站的介面,不能開啟第二個介面。具體細節,我會拿出例項程式碼來詳細闡述。
一、 懶漢模式
1、 例項
public class Singleton { //在單例類的內部建立一個自己本身的物件 private static Singleton s=new Singleton(); //獲得單例的物件 public static Singleton getSingleton(){ return s; } //構造器的私有化 private Singleton(){ } } class TestDemo{ public static void main(String[] args) { Singleton s1= Singleton.getSingleton(); System.out.println(s1); //測試是否引用的是否是同一個物件 Singleton s2= Singleton.getSingleton(); System.out.println(s2); Singleton s3= Singleton.getSingleton(); System.out.println(s3); } }
執行結果
總結:說明引用的都是同一個物件,這就是單例模式。下面分析一下原理。
2、 原理
其實這就是一個靜態屬性的生命週期。
因為構造器(就是建構函式)是空的,所以在堆中new Singleton只有一個地址,資料共享區的Singleton定義的s也有地址,指向堆中的0x999;當呼叫getSingleton()這個方法的時候,getSingleton就進棧產生一個地址,在getSingleton()執行完之後,返回了一個物件s(請看上方程式碼return s; ),s正好又是new Singleton()地址(請看上方程式碼private static Singleton s=new Singleton();)。所以在TestDemo中的s1的地址就會指向new Singleton的地址,在下面繼續s2、s3的時候,都會拿到一個相同的地址。
二、 餓漢模式
1、 例項
public class Singleton { //在單例類的內部建立一個自己本身的物件 private static Singleton s; public static Singleton getSingleton(){ if (s == null){ s=new Singleton(); return s; } return s; } //構造器的私有化 private Singleton(){ } } class TestDemo{ public static void main(String[] args) { Singleton s1= Singleton.getSingleton(); System.out.println(s1); } }
對比一下“懶漢模式”突然發現,“餓漢模式”巧妙的節省了資源。