泛型編程與設計新思維之二
設計新思維
將設計模式(design patterns)、泛型編程(generic programming)和面向對象編程(object-oriented programming)有機的結合起來,便形成了設計新思維。其中,設計模式是經過提煉的出色設計方法,對于很多情況下碰到的問題,它都是合理而可復用的解決方案;泛型編程是一種典范(paradigm),專注于將類型抽象化,形成功能需求方面的一個精細集合,并利用這些需求來實現算法,相同的算法可以運用于廣泛的類型集中,所謂泛型,就是具有在多種數據類型上皆可操作的含意;最后同面象對象編程中的多態(polymorphism)和模板(templates)等技術相結合,便獲得極高層次上的具有可復用性的泛型組件。泛型組件預先實現了設計模塊,可以讓用戶指定類型和行為,從而形成合理的設計,主要特點是靈活、通用和易用。
policies和policy類,是一種重要的類設計技術,所謂policy,是用來定義一個類或類模板的接口,該接口由下列之一或全部組成:內部類型定義、成員函數和成員變量?;趐olicy的類由許多小型類(稱為policies)組成,每一個這樣的小型類只負責單純如行為或結構的某一方面。Policies機制由模板和多重繼承組成,它們可以互相混合搭配,從而形成設計戎的多樣性,通過plicy類,不但可以定制行為,也可以定制結構。
下面簡單舉例說明泛化思維和面向對象思維在部分設計模式中的運用。
Singletons設計模式泛化實現
Singleton模式是一種保證一個對象(class)只有一個實體,并為它提供一個全局訪問點。Singleton是一種經過改進的全局變量,既在程序中只能有唯一實體的類型,它的重點主要集中在產生和管理一個獨立對象上,而且不允許產生另一個這樣的對象。
先讓我們看看一般的C++實現的基本手法,下面是實現源碼:
// Singleton.h文件中
class Singleton
{
public:
static Singleton& Instance()
{
if(!pInstance_){
if(destroyed_){ // 引用是否已經失效
OnDeadReference();
}
else {
Create(); // 第一次時創建實例
}
}
return *pInstance_;
}
private:
Singleton(); // 禁止默認構造
Singleton(const Singleton&); // 禁止拷貝構造
Singleton& operator= (const Singleton&); // 禁止賦值操作
static void Create() // 傳加創建的實例引用
{
static Singleton theInstance;
pInstance_ = &theInstance;
}
static void OnDeadReference()
{
throw std::runtime_error(“ 實例被不正當消毀”);
}
virtual ~Singleton()
{
pInstance- = 0;
destroyed_ = true;
}
static Singleton *pInstance_;
static bool destroyed_;
}
// Singleton.cpp中靜態成員變量初始化
Singleton* Singleton::pInstance_ = 0;
Bool Singleton::destroyed_ = false;
如上所示,Singleton模式實現中只有一個public成員Instance()用來第一次使用時創建單一實例,當第二次使用時靜態變量將已經被設定好,不會再次創建實例。還將默認構造函數、拷貝構造函數和賦值操作符放在private中,目地是不讓用戶使用它們。另外,為避免實例意外消毀后再實例化情況,加入靜態布爾變量destroy_來進行判斷是否出錯,從而達到穩定性。
從上面一般實現可以看出Singleton模式實現主要在于創建(Creation)方面和生存期(Lifetime)方面,既可以通過各種方法來創建Singleton。Creation必然能創建和摧毀對象,必然要開放這兩個相應函數,將創建作為獨立策略分離開來是必需的,這樣你就可以創建多態對象了,所以泛化Singleton并不擁有Creator對象,它被放在CreationPolicy<T>類模板之中。生命期是指要遵循C++規則,后創建都先摧毀,負責程序生命期某一時刻摧毀Singleton對象。
下面是一個簡單的泛化Singleton模式的實現(不考慮線程因素)
template
<
class T,
template<class> calss CreationPolicy = CreateUsingNew,
template<class> class LifetimePolicy=DefaultLifetime,
>
classs SingletonHolder
{
public:
static T& Instance()
{
if(!pInstance_)
{
if(destroyed_)
{
LifetimePolicy<T>::OnDeadReference();
destroyed_ = false;
}
pInstance_ = CreationPolicy<T>::Create();
LifetimePolicy<T>::SchedultCall(&DestorySingleton);
}
return *pInstance_;
}
private:
static void DestroySinleton()
{
assert(!destroyed_);
CreationPlicy<T>::Destroy(pInstance_);
pInstance_ = 0;
destroyed_ = true;
}
SingletonHolder();
SingletonHolder (const SingletonHolder &);
SingletonHolder & operator= (const SingletonHolder &);
Static T* pInstance_;
Static bool destroyed_;
};
Instance()是SingletonHolder開放的唯一一個public函數,它在CreationPolicy、LifetimePolicy中打造了一層外殼。其中模板參數類型T,接收類名,既需要進行Singleton的類。模板參數內的類模板缺省參數CreateUsingNew是指通過new操作符和默認構造函數來產生對象,DefaultLifetime是通過C++規則來管理生命期。LifetimePolicy<T>中有二個成員函數,ScheduleDestrution()函數接受一個函數指針,指向析構操作的實際執行函數,如上面DestorySingleton析構函數;OnDeadReference()函數同上面一般C++中同名函數相同,是負責發現失效實例來拋出異常的。CreationPlicy<T>中的Create()和Destroy()兩函數是用來創建并摧毀具體對象的。
下面是上述泛化Singleton模式實現的使用:
1、應用一
class A{};
typedef SingletonHolder<A, CreateUsingNew> SingleA;
2、應用二
class A{};
class Derived : public A {};
template<class T> struct MyCreator : public CreateUsingNew<T>
{
static T* Create()
{
return new Derived;
}
static void Destroy(T* pInstance)
{
delete pInstance;
}
}
typedef SingletonHolder<A,MyCreator> SingleA;
通過上面示例可以看出, SingletonHolder采用基于plicy設計實現,它將Singleton對象分解為數個policies,模板參數類中CreationPolicy和LifetimePolicy相當于二個policies封裝體。利用它們可以協助制作出使用者自定義的Singleton對象,同時還預留了調整和擴展的空間。由此而得,泛型組件(generic components),是一種可復用的設計模板,結合了模板和模式,是C++中創造可擴充設計的新方法,提供了從設計到代碼的簡易過渡,幫助我們編寫清晰、靈活、高度可復用的代碼。
參考文獻
C++ Primer(第三版) --- 潘愛民等譯
Effective C++(第二版) --- 侯捷譯
More Effective C++ --- 侯捷譯
Exceptional C++ --- 卓小濤譯
More Exceptional C++ --- 於春景譯
深度探索C++對象模型 --- 侯捷譯
泛型編程與STL --- 侯捷譯
設計模式:可復用面向對象軟件的元素 --- 李英軍等譯
C++設計新思維 --- 侯捷等譯
聯系方式:
地址:陜西省西安市勞動路90號院(臺板廠家屬院)六單元
郵編:710082
EMAIL:
未來工作室(Future Studio)
原文轉自:http://www.anti-gravitydesign.com