1.單例設計模式概述
單例模式就是要確保類在內存中只有一個對象,該實例必須自動創建,並且對外提供。
2.優點
在系統內存中只存在一個對象,因此可以節約系統資源,對於一些需要頻繁創建和銷燬的對象單例模式無疑可以提高系統的性能。
3.缺點
沒有抽象層,因此擴展很難。
職責過重,在一定程序上違背了單一職責
問題:如何保證類在內存中只有一個對象呢(對象的創建隨着類的加載而加載,這種成爲餓漢式))
A:把構造方法私有化
private Student(){}
B:在成員位置自己創建一個私有靜態對象
private static Student s = new Student()
C:通過一個靜態公共的方法訪問
public static Student getStudent(){return s;}
問題:如何保證類在內存中只有一個對象呢(在用的時候,纔去創建對象,這種成爲懶漢式)
A:把構造方法私有化
private Teacher(){}
B:在成員位置自己創建一個私有靜態對象
private static Teacher t = null
C:通過一個靜態公共的方法訪問
public static Student getStudent(){
if(t == null){
t = new Teacher();
}else{
return t;
}
開發:餓漢式
面試:懶漢式
A:懶加載思想(延遲加載)B:線程安全問題
a:是否多線程環境
b:是否有共享數據
c:是否有多條語句操作共享數據
JDK Runtime類 就是用的餓漢模式
懶漢模式在多線程成存在線中會出現多例錯誤,使用dcl雙檢查機制
public static MyObject getInstance(){
try{
if(myObject != null){//如果不爲null什麼也不做
}else{//如果null先睡3秒,有可能別人在創建
Thread.sleep(3000);
Synchronized (MyObject.class){
if(myObject == null){//輪到你進來了,再次判斷是不是null
myObject = new MyObject();
}
}
}
}catch(InterruptedException e){
e.printStackTrace();
}
return myObject
}