原文連接:設計模式–>單例設計模式
設計模式入門:單例設計模式
單例設計模式解決的問題:
jvm虛擬機內,只許創建一個對象(保證一個類僅有一個實例,並提供一個訪問它的全局訪問點)
就是說,只允許 此類,只能new一個對象!!!
設計思想:
)1:私有化默認構造器,不允許外界訪問。
)2:設置外部靜態訪問對象。
)3:創建外部訪問對象,並判斷是否已經存在。
public class SingleModel {
/**
* 單例設計模型:
* 解決問題:在jvm虛擬機內,只許創建一個對象(保證一個類僅有一個實例,並提供一個訪問它的全局訪問點)
* <p>
* <p>
* 設計思想:
* 1、私有化默認構造器,不讓外界無限訪問創建
* 2、提供單個訪問接口
* 3、首次創建對象類,採用懶加載
* <p>
* 優點:對外保證一個實例對象
* 缺點:多線程同時訪問,可能造成多個實例
* <p>
* 應用場景:
* 參數、多出應用的參數、
* *
*/
private String name;
private String age;
private static SingleModel singleModel;
//私有化構造器:
//注意:一般開發中,如果要創建,設爲public
private SingleModel() {
}
//創建外部訪問對象
public static SingleModel getInstance() {
if (singleModel == null) {
//懶加載
return new SingleModel();
}
return singleModel;
}
//<請加上,get,set方法,這裏省略>;
}
2、改進:變爲線程安全實例
改進思想:在外部調用方法上加鎖synchronized
產生新問題:每次加鎖線程會產生上下文切換的開銷
改進思想:判空處理
//創建外部訪問對象
public static SingleModelSyn getInstance() {
//解決線程上下文切換,所產生的時間開銷
if (singleModel == null) {
//加鎖線程鎖,解決多線程創建多個實例
synchronized (SingleModelSyn.class) {
if (singleModel == null) {
//懶加載
return new SingleModelSyn();
}
}
}
return singleModel;
}
/*//餓漢模式:以空間換時間做法
private static SingleModelProSyn singleModel = new SingleModelProSyn();
private SingleModelProSyn() {
}
public static SingleModelProSyn getInstance() {
return singleModel;
}*/
3、額外改進,創建自定義個實例
public class SingleModelPro {
/**
* 改進:單例創建多個單例對象
* *
*/
private String name;
private String age;
private static int maxNumberSingleModelProTow = 2;//最大創建數
private static int number = 1;//首次創建個數
//創建一個map集合,用來存儲創建好的實例
public static Map<String, SingleModelPro> singleModelMap = new HashMap<>();
//私有化構造器:
private SingleModelPro() {
}
//創建外部訪問對象
public static SingleModelPro getInstance() {
//直接獲取靜態key值
SingleModelPro singleModelPro = singleModelMap.get(number);
if (singleModelPro == null) {
//如果爲空,new一個對象,number做key,對象做value
singleModelPro = new SingleModelPro();
singleModelMap.put(number + "", singleModelPro);
}
number++;
//循環在1-2之間
if (number > maxNumberSingleModelProTow) {
number = 1;
}
return singleModelPro;
}
//<請加上,get,set方法,這裏省略>;
}
面向開發過程,記錄學習之路。