單例模式主要符合單一職能原則。當乙個類的職責是一定的,而且整個程式中不需要生成第二個此類的物件,而且如果生成第二個此類的物件的話還會有問題(比如我之前寫的聯棋遊戲,裡面的棋盤就應該始終只有乙個物件,如果有兩個會造成混亂),為了防止生成兩個物件,而且節約記憶體,會使用單例模式。使用單例模式的典型場景比如資料庫連線類,遊戲主流程控制類等。
解決思路:
1.不允許其他程式使用new建立該類物件。(別人new不可控)
2.在該類中建立乙個本類例項。
3.對外提供乙個方法讓其他程式可以獲取該物件。
解決步驟:
1.私有化該類的建構函式
2.通過new在本類中建立乙個本類物件。
3.定義乙個共有的方法將建立的物件返回。
單例模式有三種型別:餓漢式、懶漢式、加強版的懶漢式。
一、餓漢式
public class hungry ;
// 在本類中建立乙個本類的物件
private static final hungry single = new hungry();
// 提供乙個public方法,供其他類獲得上面構造的物件
public static hungry getinstance()
//測試函式
public void connectdb()
}
測試類:
public class test
}
二、懶漢式
public class lazy ;
//唯一物件
private static lazy single=null;
//外部獲得該物件的方法
public lazy getinstance()
return single;
}}
懶漢式將唯一類的生成從成員函式的初始化推遲到方法中。餓漢式中的single是在hungry類被裝載進jvm中就被初始化成類。而這裡被初始化成null。
這樣如果該物件沒有被用到過,那麼single就不會生成物件,盡最大可能節約記憶體。
而且因為single會在之後賦值,所以宣告時沒有使用final關鍵字。
但是如果在多執行緒中,這個方式可能會使記憶體中存在多個物件,所以這種方式一般很少用。比如執行完了if判斷語句就轉向其他執行緒的if語句了,然後兩個都判斷為false,那麼接下來就會生成兩個物件。
三、迭代後的懶漢式
為了解決這個方法,就使用同步,為getinstance方法新增關鍵字synchronized :
public synchronized lazy getinstance()
return single;
}
但是這樣每次呼叫此方法時都要判斷鎖,會嚴重降低效率,所以把這個關鍵字放在裡面修飾語句:
public lazy getinstance()
return single;
} }
但其實好像並沒有什麼區別,還是每次呼叫的時候都要判斷鎖,如何做到只有當建立物件的時候才加鎖,當物件不為空的時候就直接返回物件呢?最終的解決方案:
那就是在加鎖前判斷物件是否為null:
public lazy getinstance()
return single;
}} return single;
}
第一次判斷是為了提公升效率,當single物件已經生成就不需要檢測鎖,直接返回物件。
然後同步**塊保護執行緒安全,如果多個執行緒都執行了第乙個判斷後,進入到同步**塊,那麼第二個if是為了這多個執行緒中只有乙個生成物件,其他執行緒可以在第二個if外獲得該執行緒生成的物件。
參考:
單態設計模式(Singleton pattern)
單態 單例 設計模式 單態設計模式 singleton pattern 就是要保證在整個程式中某個類只能存在乙個物件,這個類不能再建立第二個物件。單態設計模式的寫法 私有化建構函式,阻止建立新物件。單例設計模式 在記憶體中物件只有乙個存在。餓漢式class student private stati...
5 第 5 章 迴圈
1.可以用迴圈來驗證輸入。在迴圈前的第一次讀取操作,稱為啟動讀取,如果後續還需要繼續讀取,則語句應該在迴圈中。2.在實際程式設計應用中,不建議在 cout 語句中放置遞增或遞減運算子 因為容易出錯 3.需要計數時使用計數器,需要累計彙總時使用累加器。4.標記符號是乙個特殊值,指示著值列表的結尾。一般...
5X5矩陣調換!
將乙個5x5矩陣中最大的元素放在中心,4個角分別放4個最小的元素,寫一函式實現之!include int main printf n return 0 void change int p temp p 12 p 12 pmax pmax temp temp p p pmin pmin temp pm...