從「單例」的字面意思上理解為:乙個類只有乙個例項。所以單例模式也就是保證乙個類只有乙個例項的一種實現方法。官方給出的定義:確保乙個類只有乙個例項,並提供乙個全域性訪問點。
單例模式的實現**很簡單,也很容易看懂,但每次使用都會想為什們前人會這樣實現單例模式呢?他們如何思考的呢?
我們從單例模式的概念入手,可以把概念分為兩部分:(1)確保乙個類只有乙個例項。(2)提供乙個訪問它的全域性訪問點。通過乙個對話情景來分析下思路:
新手:怎樣確保乙個類只有乙個例項?
高手:你建立類的例項會想到用什麼方式?
新手:用new關鍵字吧,只要new下就建立的類的乙個個例項了,之後就可以使用該類的一些屬性和例項方法了
高手:那你想過為什麼可以使用new關鍵字來建立類的例項嗎?
新手:我想想.....哦,想起來了。如果類定義了私有的建構函式就不能在外界通過new建立例項了。(在編寫乙個類是,很多時候我們沒有自己編寫建構函式,此時編譯器會幫我們生成乙個共有的無參的建構函式)
高手:嗯。就是這樣。
新手:那我要在**建立類的例項?
高手:你笨啊,當然是在類裡面建立了,(注:這樣定義私有建構函式就是上面的乙個思考過程。要建立例項,就需要乙個變數來儲存該例項,所有就有了私有變數的宣告。但是現實中是定義靜態私有變數,為什麼?因為每個執行緒都有自己的執行緒棧,定義為靜態主要是為了在多執行緒確保類只有乙個例項)
新手:明白了。但是還有乙個疑問:現在類例項建立在類的內部,那外界如何獲得該類的乙個例項來使用它?
高手:你可以定義乙個共有方法或者屬性來把該類的例項公開出去。(這樣就有了共有方法的定義了,該方法就是提供方法訪問類的全域性訪問點)
下面貼出單例模式的實現**:
public class singleton
//定義公有方法提供乙個全域性的訪問點,同時也可以定義公有屬性來提供全域性訪問點
public static singleton getinstance()
return uniqueinstace;
}}
上面單例模式的實現在單執行緒下確實是完美的,然而在多執行緒的情況下會得到多個singleton例項,因為在兩個執行緒同時執行getinstance方法時,此時兩個執行緒判斷(uniqueinstance == null)這個條件時都返回為真,此時兩個執行緒就都會建立singleton例項,這樣就違背了單例模式的初衷了。既然上面的實現會執行多個執行緒執行,那麼對於多線的解決方案就是讓getinstance方法在同一時間只執行乙個執行緒執行就行了,也就是執行緒同步的問題了(後續會講)。
public class singleton
//定義公有方法提供乙個全域性的訪問點,同時也可以定義公有屬性來提供全域性訪問點
public static singleton getinstance()
} }
return uniqueinstance;
}}
2 5設計模式(單例設計模式)
1.設計模式 23種設計模式。對問題行之有效的解決方式。其實它是一種思想。2.單例設計模式 就是可以保證乙個類在記憶體中的物件唯一性。解決辦法 步驟 1 私有化該類的建構函式。2 通過new在本類中建立乙個本類物件 3 定義乙個公有的方法,將建立的物件返回。例子 1.餓漢式 一上來就吃 設計模式 2...
設計模式 C 設計模式 單例模式
設計模式 物件導向設計七大原則 設計模式 設計模式概念和分類 設計模式 c 設計模式 單例模式 設計模式 c 設計模式 工廠方法模式 設計模式 c 設計模式 抽象工廠模式 設計模式 c 設計模式 建造者模式 設計模式 c 設計模式 原型模式 作者自用的泛型單例模組 單例模式 singleton pa...
C 設計模式 (單例模式)
單例模式 顧名思義,只有乙個物件例項,即保證乙個類只有乙個物件可以使用。作用類似於乙個全域性變數,可以任意呼叫,但是比全域性變數更容易管理,使用。單例模式也有很多種實現方式 第一種實現方法 h檔案 class csock test public casyncsocket cpp檔案 csock te...