單例
單例模式就是一個對象隻有唯一執行個體,
建立一個類
public class Singleton {
private Integer id;
private String name;
}
建一個測試類
public class Test {
public static void main(String[] args) {
//通過無參的構造方法建立執行個體化對象,系統預設提供一個無參的構造方法
Singleton s1 = new Singleton();
Singleton s2 = new Singleton();
if(s1 == s2){
System.out.println("同一個執行個體");
}else{
System.out.println("不同的執行個體");
}
}
}
//運作結果是 ---> 不同的執行個體
正常模式下的執行個體化對象,是建立不同的執行個體
單例(餓漢式)
将構造方法私有化,這樣外界就無法建立對象的執行個體
//構造方法私有化,外部無法建立對象
private Singleton(){
}
//并建立對象的唯一執行個體
static Singleton instance = new Singleton();
這時我們可以通過 —> 類名.對象 直接調用唯一的執行個體
Singleton s3 = Singleton.instance;
Singleton s4 = Singleton.instance;
if(s3 == s4){
System.out.println("同一個執行個體");
}else{
System.out.println("不同的執行個體");
}
運作結果--->同一個執行個體
但是一般情況下我們會将唯一的執行個體給私有化
//建立類的唯一執行個體 靜态的 私有的
private static Singleton instance = new Singleton();
這時外部就無法通過 類名.對象 的方法擷取執行個體
我們可以提供一個擷取執行個體的方法
//建立擷取唯一執行個體的方法
public static Singleton getInstance(){
return instance;
}
Singleton s3 = Singleton.getInstance();
Singleton s4 = Singleton.getInstance();
if(s3 == s4){
System.out.println("同一個執行個體");
}else{
System.out.println("不同的執行個體");
}
}
//運作結果 同一個執行個體
那麼為什麼叫餓漢式呢?
我們建立了類的唯一執行個體,而且是static修飾的,那麼這個執行個體是什麼時候加載的呢?
所有靜态static修飾的東西,都是在類加載的時候生成執行的
是以在類加載的時候,類的唯一執行個體就已經被建立,(着急忙慌的吃不飽,是以叫餓漢式)
懶漢式
//構造方法私有化,外部無法建立對象
private Singleton(){
}
//聲明(而非建立)類的唯一執行個體 靜态的 私有的
private static Singleton instance ;
//建立唯一執行個體的方法
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
Singleton s5 = Singleton.getInstance();
Singleton s6 = Singleton.getInstance();
if(s5 == s6){
System.out.println("同一個執行個體");
}else{
System.out.println("不同的執行個體");
}
//運作結果 ---> 同一個執行個體
類加載的時候并沒有建立類的唯一執行個體,隻有當使用者擷取執行個體的時候才會判斷是否建立,顯而易見:第一次擷取執行個體時為空,建立類的唯一執行個體,之後便不需要建立(俗稱懶漢式)