設計模式
是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案
單例模式
目的:使得類的一個對象成為該類系統(tǒng)中的唯一實例
定義:一個類有且僅有一個實例,并且自行實例化向整個系統(tǒng)提供
因此,設計要點是:
某個類只能有一個實例
必須自行創(chuàng)建實例
必須自行向整個系統(tǒng)提供這個實例
實現(xiàn):
只提供私有的構(gòu)造方法
含有一個該類的靜態(tài)私有對象
提供一個靜態(tài)的公有方法用于創(chuàng)建、獲取靜態(tài)私有對象
代碼實現(xiàn)方案:
餓漢式
懶漢式
餓漢式
類加載時,靜態(tài)實例對象完成了實例化操作;空間換時間。(對象創(chuàng)建過程中實例化)
餓漢式線程安全
新建文件SingletonOne.java
/**
* 餓漢式
*/
public class SingletonOne {
//1.創(chuàng)建類中的私有構(gòu)造函數(shù)
private SingletonOne(){
}
//2.創(chuàng)建該類型的私有靜態(tài)實例
private static SingletonOne instance = new SingletonOne();
//3.創(chuàng)建公有靜態(tài)方法返回靜態(tài)實例對象
public static SingletonOne getInstance(){
return instance;
}
}
新建文件Test.java
public class Test {
public static void main(String[] args) {
SingletonOne one = SingletonOne.getInstance();
SingletonOne two = SingletonOne.getInstance();
System.out.println(one);
System.out.println(two);
}
}
輸出結(jié)果可以看到是同一個類的地址。
懶漢式
類加載時并未實例化,第一次使用時才進行實例化;時間換空間。(靜態(tài)公有方法中實例化)
懶漢式存在線程風險
懶漢式線程安全的解決方案:(此處大致介紹下,后邊在線程篇會詳細介紹)
同步鎖
雙重校驗鎖
靜態(tài)內(nèi)部類
枚舉
新建文件:SingletonOne.java
public class SingletonTwo {
//1.創(chuàng)建私有構(gòu)造方法
private SingletonTwo(){
}
//2.創(chuàng)建靜態(tài)的該類實例對象
private static SingletonTwo instance = null;
//3.創(chuàng)建開放的靜態(tài)方法提供實例對象
public static SingletonTwo getInstance(){
if(instance == null)
instance = new SingletonTwo();
return instance;
}
}
新建文件Test.java
public class Test {
public static void main(String[] args) {
SingletonTwo one = SingletonTwo.getInstance();
SingletonTwo two = SingletonTwo.getInstance();
System.out.println(one);
System.out.println(two);
}
}
輸出結(jié)果同上餓漢式代碼
單列模式的特點以及應用場景
優(yōu)點:
在內(nèi)存中只有一個對象,節(jié)省內(nèi)存
避免頻繁的創(chuàng)建和銷毀對象,提高性能
避免對共享資源的多重占用
缺點:
擴展比較困難
如果實例化后的對象長期不利用,系統(tǒng)將默認認為垃圾,進行回收,造成對象狀態(tài)丟失
使用場景:
創(chuàng)建對象時占用資源過多,但同時又需要用到該類對象
對系統(tǒng)內(nèi)資源要求統(tǒng)一讀寫,如讀寫配置信息
當多個實例存在可能引起程序邏輯錯誤,如號碼生成器