什么是單例模式?
類的一個對象成為整個系統(tǒng)中的唯一實例。
特點:
? ? ? ?1、單例類只能有一個實例。
? ? ? ?2、單例類必須自己創(chuàng)建自己的唯一實例。
? ? ? ?3、單例類必須給所有其他對象提供這一實例。
例:
一、懶漢式單例
publicclassSingleton {
private ?static ?class ?LazyHolder?{
private ?static ?final ?Singleton?instance =new Singleton();
}
privateSingleton?(){}
public static final Singleton?getInstance()?{
return LazyHolder.instance;
}
}
Singleton通過將構(gòu)造方法限定為private避免了類在外部被實例化,在同一個虛擬機范圍內(nèi),Singleton的唯一實例只能通過getInstance()方法訪問。
二、餓漢式單例
//餓漢式單例類.在類初始化時,已經(jīng)自行實例化
publicclassSingleton {
privateSingleton()?{}
private ?staticfinal Singleton single?=new Singleton();
//靜態(tài)工廠方法
publicstaticSingleton1?getInstance()?{
returnsingle;
}
}
餓漢式在類創(chuàng)建的同時就已經(jīng)創(chuàng)建好一個靜態(tài)的對象供系統(tǒng)使用,以后不再改變,所以天生是線程安全的。(推薦新手使用,簡單粗暴)
什么時候使用單例模式?
需要頻繁實例化然后銷毀的對象。創(chuàng)建對象時耗時過多或者耗資源過多,但又經(jīng)常用到的對象。有狀態(tài)的工具類對象。頻繁訪問數(shù)據(jù)庫或文件的對象。
為什么要使用單例模式?
對于系統(tǒng)中的某些類來說,只有一個實例很重要,例如,一個系統(tǒng)中可以存在多個打印任務(wù),但是只能有一個正在工作的任務(wù);
定義一個全局變量可以確保對象隨時都可以被訪問,但不能防止我們實例化多個對象。一個更好的解決辦法是讓類自身負責(zé)保存它的唯一實例。這個類可以保證沒有其他實例被創(chuàng)建,并且它可以提供一個訪問該實例的方法。這就是單例模式的模式動機。