c 單件模式

2021-08-26 04:03:25 字數 2245 閱讀 4756

1. 意圖

保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

2. 動機

對一些類來說,只有乙個例項是很重要的。雖然系統中可以有許多印表機,但卻只應該有乙個列印假離線( printer spooler),只應該有乙個檔案系統和乙個視窗管理器。乙個數字濾波器只能有乙個a / d轉換器。乙個會計系統只能專用於乙個公司。

我們怎麼樣才能保證乙個類只有乙個例項並且這個例項易於被訪問呢?乙個全域性變數使得乙個物件可以被訪問,但它不能防止你例項化多個物件。乙個更好的辦法是,讓類自身負責儲存它的唯一例項。這個類可以保證沒有其他例項可以被建立(通過擷取建立新物件的請求),並且它可以提供乙個訪問該例項的方法。這就是singleton模式。

3. 適用性

在下面的情況下可以使用singleton模式. 當類只能有乙個例項而且客戶可以從乙個眾所周知的訪問點訪問它時。 當這個唯一例項應該是通過子類化可擴充套件的,並且客戶應該無需更改**就能使用乙個擴充套件的例項時。

4. 結構

5. 參與者

singleton

定義乙個getinstance操作,允許客戶訪問它的唯一例項。getinstance是乙個類操作(即smalltalk中的乙個類方法和c++中的乙個靜態成員函式)。可能負責建立它自己的唯一例項。

6. 協作

客戶只能通過singleton的getinstance操作訪問乙個singleton的例項。

7. 效果

singleton模式有許多優點:

1) 對唯一例項的受控訪問因為singleton類封裝它的唯一例項,所以它可以嚴格的控制客戶怎樣以及何時訪問它。

2) 縮小名空間singleton模式是對全域性變數的一種改進。它避免了那些儲存唯一例項的全域性變數汙染名空間。

3) 允許對操作和表示的精化singleton類可以有子類,而且用這個擴充套件類的例項來配置乙個應用是很容易的。你可以用你所需要的類的例項在執行時刻配置應用。

4) 允許可變數目的例項這個模式使得你易於改變你的想法,並允許singleton類的多個例項。此外,你可以用相同的方法來控制應用所使用的例項的數目。只有允許訪問singleton例項的操作需要改變。

5) 比類操作更靈活另一種封裝單件功能的方式是使用類操作(即c++中的靜態成員函式或者是smalltalk中的類方法)。但這兩種語言技術都難以改變設計以允許乙個類有多個例項。

此外,c++中的靜態成員函式不是虛函式,因此子類不能多型的重定義它們。

8. 實現

class singleton

public:

~singleton(){}

//return this singleton class' instance pointer

static singleton* instance()

return m_pinstance.get(); }

};怎樣來使用它呢?不要試圖從這個類派生你的單件子類,那樣的結果是不妥當的,如果你需要多個單件子類,還是使用下面的巨集定義更為妥當:

#define define_singleton(cls)\

private:\

static std::auto_ptrm_pinstance;\

protected:\

cls(){}\

public:\

~cls(){}\

static cls* instance()\

return m_pinstance.get();\ }

#define implement_singleton(cls) \

std::auto_ptrcls::m_pinstance(null);

假定你需要實現乙個單件類yy,這樣書寫:

class yy ;

在cpp檔案中,書寫:

implement_singleton(yy);

需要引入這個類的例項的時候,使用這樣的語句:

yy* pyy = yy::instance();

這,就是全部。

如果需要定義其他的單件類,重複上面的定義,就可以了。

當想集中管理乙個應用程式所需的所有配置時,可以宣告乙個ctoolsoptions的類,其中包含配置屬性集合。對於這個類的例項,顯然是乙個例項就夠了;當編寫繪圖程式時,考慮繪製矩形,圓形等分別使用cgraphtool派生的工具類,每個派生類負責處理具體的繪製動作和相關的ui相應邏輯。這些工具類典型的在被使用者選擇工具欄的圖元按鈕時被選中。依照這種模式,你應該對所有的圖元工具從事註冊工作,使得繪圖程式了解執行時刻可以使用那些圖元工具。同樣的,負責管理註冊資訊的這個管理器也只需要乙個例項就行了。

單件模式(c )

單件模式是設計模式中最簡單的模式了。定義 確保乙個類只有乙個例項,並提供乙個全域性的訪問點。看下 的實現 class singleton 2 5 public 6 singleton 7 8static shared ptrgetinstance 9 else 15 16private 17stat...

C 單件模式

單件模式應該是所有設計模式中最簡單的乙個了,但是如果使用不當會出現很多問題,下面我們就分析一下單件模式 作用 保證乙個class只有乙個實體 instance 並為它提供乙個全域性唯一的訪問點 適用性 1 對於乙個類 物件 如果它比較大 占用的系統資源非常多 而且這些資源可以被全域性共享,則可以設計...

C 單件類,設計模式 單件

定義 單件 singleton 模式保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。結構 理解 1.singleton 模式用來取代全域性靜態變數。c 通過靜態成員變數來實現類例項全域性唯一性。2.instance 方法是單件提供的唯一呼叫入口。要點 1.為了防止外界呼叫產生多個例項,將構造...