可繼承擴充套件的單例實現

2021-08-21 11:28:10 字數 1166 閱讀 1206

最近在**閱讀中看到了一種可繼承的單例實現,對使用者而言通過單例基類到定義的靜態介面獲取例項,而不必關心實際的單例實現。靈活性上,可通過繼承的重寫虛介面的方式實現單例功能的擴充套件。基礎**如下:

/* testsingleton.h */

#include

using

namespace

std;

#define classname(klass) (#klass)

class singletonbase;

namespace

class singletonbase

;singletonbase::singletonbase()

singletonbase::~singletonbase()

singletonbase* singletonbase::get()

void singletonbase::testsingleton()

class singletonimp1 : public singletonbase

;singletonimp1::singletonimp1()

: singletonbase()

singletonimp1::~singletonimp1()

void singletonimp1::testsingleton()

void gotest()

當然在擴充套件性增強的同時也帶來問題:相對於傳統單例實現方式–在get介面中new乙個當前型別的例項,此種單例例項的建立暴露給了使用者,需要由使用者事先選擇並建立指定子型別的例項,然後其他地方獲取單例物件使用。

單例便於單例型別中的介面呼叫,避免了型別上功能相互呼叫時引數傳遞的麻煩。但單例使用也存在一定的問題:

1. 單例的生命週期不易控制;

2. 單例使得型別間的依賴更加隱蔽且難以管理;

3. 單例中的定義的功能介面不易繼承擴充套件:例如在專案開發中錯誤資訊提示視窗統一在視窗右上角提示。實現上可通過定義訊息提示的單例物件,在程式出錯處呼叫單例物件的介面完成訊息提示。隨著功能的演進,又有了新的需求:訊息不僅要在視窗右上提示,部分錯誤要以彈模態框的方式提示。因例項唯一,在介面不動的情況下通過繼承的方式進行擴充套件顯然是做不到的,而且單例介面變動帶來的改動量也相當可觀。所以功能介面功能比較穩定可封裝為單例,如若不然就要為以後的功能變動買單。

C 單例不可繼承

c 語言和單例的特性決定了單例不可繼承。單例有如下幾項要求 1.建構函式為私有,或者至少不可以被此類的繼承體系以外的類訪問當,即要麼是private,最壞也是protected 2.建構函式只被呼叫一次,以初始化static物件。所以如果b1,b2,繼承至單例a,則不可以實現在程式執行的整個過程中既...

css 可繼承和不可繼承的屬性

一 有繼承性的屬性 1 字型系列屬性 font 組合字型 font family 規定元素的字型系列 font weight 設定字型的粗細 font size 設定字型的尺寸 font size繼承的是計算後的實際值 font style 定義字型的風格 font variant 設定小型大寫字母...

css中可繼承和不可繼承的屬性

一 無繼承性的屬性 1 display 規定元素應該生成的框的型別 2 文字屬性 vertical align 垂直文字對齊 text decoration 規定新增到文字的裝飾 text shadow 文字陰影效果 white space 空白符的處理 unicode bidi 設定文字的方向 3...