單例模式:一個類在內存中只有一個對象
思想:1、保證對象唯一,避免建立多個對象,禁止其他程序創建該類對象
2、爲了可以讓其他程序訪問到該類,在本類自定義一個對象
3、給其他程序提供訪問方式
實現:1、將構造函數私有化
2、在類中創建一個本類對象
3、提供一個方法可以獲取該對象
有特有參數這個單例模式纔有意義
//實際開發推薦 餓漢式
/**
* 餓漢式,single類一進內存就已創建好對象
* 記憶點:管他餓不餓,先創建再說
*/
class Single{
//特有參數
private string para;
get/set();
//私有化構造方法
private Single(){}
//私有的創建對象方法
private static Single single = new Single();
//給外部提供調用方法
public static Single getInstance(){
return single;
}
}
/**
* 懶漢式,single類進內存還沒有創建對象,只有調用了getInstance()方法才創建對象
* 記憶點:創建對象時先問一下 餓不? true 創建 false 直接返回
*/
class Single{
//特有參數
private string para;
get/set();
//私有化構造方法
private Single(){}
//私有的創建對象方法
private static Single single = null;
//給外部提供調用方法
/**
* TODO此處存在問題:如果兩個調用同時(a進程掛起時,b進程進來)進來就會造成對象不唯一
*/
/*解決方案1:方法加synchronized關鍵字
缺點:效率比較低,進來就判斷*/
p1:public static synchronized Single getInstance(){
if(null != single)
single = new Single();
return single;
}
/*解決方案2:先判斷是否存在對象,不存在 則先給single類加鎖,再創建對象,如果存在兩個進程同時進來,則二次判斷就保證唯一
缺點:代碼量增加*/
p2:public static Single getInstance(){
if(null != single){
synchronized(Single.class){
if(null != single)
single = new Single();
}
}
}
}
class SingleDemo{
public static void main(String[] args){
Single single = Single.getInstance();
}
}