單態模式作為乙個經典的設計模式,使用非常廣泛,最近用qt寫乙個應用,其中有多個類決定按單態模式實現,寫的過程中感覺大體上的結構都是類似的,每個寫一遍太囉嗦了,就想能不能實現乙個模板類作為基類,需要使用單態模式的類只需繼承這個類即可,方便使用也能保證質量,避免某次編碼過程漏寫東西。
先再網上找了一下有沒有別人已經實現的c++單態模板基類,但是網上大部分的**都是按照單個類的模式實現的,按基類模式寫的也都不夠完善,或者用的時候還是有點兒麻煩,綜合了幾種實現方案後,實現了第一版
模板基類
#ifndef qcsingletonbase_h
#define qcsingletonbase_h
#include #include #include templateclass qcsingletonbase
virtual ~qcsingletonbase(){};
private:
static t* s_instance;
static qmutex *s_mutex;
public:
class qcgarbo
};};templatet *qcsingletonbase::s_instance = nullptr;
templateqmutex *qcsingletonbase::s_mutex = new qmutex;
#define qc_singleton_garbo(t) qcsingletonbase::qcgarbo s_garbo;
#define qc_friend_singleton_base(t) friend class qcsingletonbase;
#endif // qcsingletonbase_h
具體單態類使用標頭檔案
#ifndef testsingleton_h
#define testsingleton_h
#include "qcsingletonbase.h"
#include class testsingleton : public qobject, public qcsingletonbase;
#endif // testsingleton_h
具體單態類cpp檔案
#include "testsingleton.h"
#include qc_singleton_garbo(testsingleton)
testsingleton::~testsingleton()
void testsingleton::output()
testsingleton::testsingleton()
該寫法需要另外宣告乙個全域性的garbo變數,否則不能自動析構單態物件,且析構函式是公有的,可以在任意位置對單態類物件呼叫delete,這就只能通過約定,在外面不呼叫delete來保證不會錯誤釋放物件。
考慮到單態類的的另一種寫法是將靜態物件宣告為區域性靜態變數,想到此處也可以通過區域性靜態變數的形式減少額外宣告靜態變數的麻煩,意外析構的問題可通過將析構函式宣告為private解決,由此得到第二版寫法。
模板基類
#ifndef qcsingletonbase_h
#define qcsingletonbase_h
#include #include #include templateclass qcsingletonbase
protected:
qcsingletonbase()
virtual ~qcsingletonbase(){};
private:
static t* s_instance;
static qmutex *s_mutex;
private:
class qcgarbo
};};templatet *qcsingletonbase::s_instance = nullptr;
templateqmutex *qcsingletonbase::s_mutex = new qmutex;
#define qc_friend_singleton_base(t) friend class qcsingletonbase;
#endif // qcsingletonbase_h
具體單體類標頭檔案
#ifndef testsingleton_h
#define testsingleton_h
#include "qcsingletonbase.h"
#include class testsingleton : public qobject, public qcsingletonbase;
#endif // testsingleton_h
現在通過在模板基類的建構函式中宣告區域性靜態變數的方式解決garbo變數宣告的問題,無需再每次都宣告乙個garbo變數,使用時需要做的就是繼承單態模板基類,將建構函式和析構函式都宣告為private的,禁用拷貝建構函式和賦值操作符,將模板基類宣告為單態類的友元類
這應該是寫乙個單態類的最小化編碼方案了
淺說單態類
一說單態類,好多程式設計師都感覺腦袋大了,什麼是單態類,它是幹什麼的,類不是可以有許多的例項嗎,怎麼會有單態類?說白了,單態類就是類的例項只有乙個.這樣大家就都會明白了吧.但是如何做類的例項只有乙份呢?大家的困惑的地方只有乙個,就是類可以在多處new 這個類的例項.可以說new 無處不在.那怎麼實現...
C 單例模板類
單例模式 singleton 是設計模式常見的一種,其目的是保證 系統中只存在某 類的唯一例項 物件 在 應用程式中,經常用於配置,日誌等的處理。使用單例模板類可以很容易地實現單例模式。如下 templateclass csingleton return m pinstance protected ...
C 模板類 單鏈表
c 作業,用模板類寫鍊錶,完成了對基本的單鏈表的插入,刪除等。include using namespace std templatestruct node templateclass linkedlist linkedlist t find int index 返回索引對應的值 void remo...