目標
今天我們還是“賭博”的一天,今天我們首先學習了深入單例設計模式,然后就進入了敲代碼的一天,這個Demo包含的只是非常多,可以說把我會的都用上了,我不會的也運用了不少,加深了我們對已經(jīng)學習的知識的串聯(lián)度。
學習的知識
什么是單例設計模式?
單例模式,是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統(tǒng)中,應用該模式的類一個類只有一個實例。即一個類只有一個對象實例。
具體實現(xiàn)
需要:
1.將構造方法私有化,使其不能在類的外部通過new關鍵字實例化該類對象。
2.在該類內(nèi)部產(chǎn)生一個唯一的實例化對象,并且將其封裝為private static類型。
3.定義一個靜態(tài)方法返回這個唯一對象。
實現(xiàn)一:立即加載 / “餓漢模式”
立即加載就是使用類的時候已經(jīng)將對象創(chuàng)建完畢(不管以后會不會使用到該實例化對象,先創(chuàng)建了再說。很著急的樣子,故又被稱為“餓漢模式”),常見的實現(xiàn)辦法就是直接new實例化。
class Pokers{
//1.默認構造函數(shù)
//2.定義一個靜態(tài)的成員變量 記錄這個單例對象
//餓漢式
//default sharedInstance manager
public static final Pokers shared=new Pokers();
private Pokers(){
}
public void test(){}
}
“餓漢模式”的優(yōu)缺點:
優(yōu)點:實現(xiàn)起來簡單,沒有多線程同步問題。
缺點:當類SingletonTest被加載的時候,會初始化static的instance,靜態(tài)變量被創(chuàng)建并分配內(nèi)存空間,從這以后,這個static的instance對象便一直占著這段內(nèi)存(即便你還沒有用到這個實例),當類被卸載時,靜態(tài)變量被摧毀,并釋放所占有的內(nèi)存,因此在某些特定條件下會耗費內(nèi)存。
實現(xiàn)二:延遲加載 / “懶漢模式”
延遲加載就是調(diào)用get()方法時實例才被創(chuàng)建(先不急著實例化出對象,等要用的時候才給你創(chuàng)建出來。不著急,故又稱為“懶漢模式”),常見的實現(xiàn)方法就是在get方法中進行new實例化。
class Player{
public int count;
//2.創(chuàng)建靜態(tài)變量
private static Player shared=null;
//1.構造方法私有化
private Player(){
}
//3.提供給外部一個訪問的方法
public static Player getInstance(){
Object b =new Object();
synchronized ((b)){
if(shared==null){
shared=new Player();
}
}
return shared;
}
}
“懶漢模式”的優(yōu)缺點:
優(yōu)點:實現(xiàn)起來比較簡單,當類SingletonTest被加載的時候,靜態(tài)變量static的instance未被創(chuàng)建并分配內(nèi)存空間,當getInstance方法第一次被調(diào)用時,初始化instance變量,并分配內(nèi)存,因此在某些特定條件下會節(jié)約了內(nèi)存。
缺點:在多線程環(huán)境中,這種實現(xiàn)方法是完全錯誤的,根本不能保證單例的狀態(tài)。
我們在所寫的demo里面采用的是惡漢模式,為了避免使用懶漢模式是有可能發(fā)生的不不必要的錯誤
敲代碼的感悟
在我們所寫的Dome里面我印象最深的就是類里面方法的使用,我們所寫的方法很多但是都是我都能看懂的方法,但是在這樣一個目前來說我們接觸過的最大的dome,里面一個方法不僅僅只是一個方法,還有方法之間的互相使用,還有一個對象對一個屬性的引用,或許正是因為這種原因,使我在閱讀代碼的時候常常會有一些疑惑,閱讀起來就像是剝繭抽絲一樣,我也就感受到了這個代碼的難度。但是我想這應該是一道我應該克服的障礙。想來也是自己的邏輯性有點差。由于自己還沒有完全搞懂所以就不上代碼了。