5 Singleton Pattern 單例模式

2021-09-24 18:30:16 字數 1910 閱讀 3649

單例模式主要符合單一職能原則。當乙個類的職責是一定的,而且整個程式中不需要生成第二個此類的物件,而且如果生成第二個此類的物件的話還會有問題(比如我之前寫的聯棋遊戲,裡面的棋盤就應該始終只有乙個物件,如果有兩個會造成混亂),為了防止生成兩個物件,而且節約記憶體,會使用單例模式。使用單例模式的典型場景比如資料庫連線類,遊戲主流程控制類等。

解決思路:

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...