2013-08-28 95 views
0

C++中優雅的設計模式(GoF模式)實現是什麼?C++中的設計模式(GoF模式)實現

任何人都可以給我一些基於模板(可以重用)的設計模式實現的例子嗎?

例(基於模板的Singleton): -

template<typename T> 
class Singleton : public boost::noncopyable 
{ 
public: 
    static Singleton& GetInstance() 
    { 
     boost::call_once(&CreateInstance, m_onceFlg); 
     return *m_pInstance; 
    } 
    virtual ~Singleton() 
    { 
    } 
protected: 
    Singleton() 
    { 
    } 
    static void CreateInstance() 
    { 
     m_pInstance.reset(new T()); 
    } 
private: 
    static boost::once_flag m_onceFlg; 
    static boost::scoped_ptr<T> m_pInstance; 
}; 
+2

我不一定會調用基於boost的C++單例實現,非常優雅... –

+2

呃,閱讀GoF書嗎?本書中的大部分示例都是C++。 – PherricOxide

+0

@Andreas Grapentin Qt的人不喜歡使用boost庫。這裏我舉了一個例子。 –

回答

1

以我的經驗,確實沒有好的設計模式模板庫。設計模式很難作爲一個具體的模板正確地捕獲,而沒有警告或者難以對試圖插入它的類實施限制。

讓我們以你的Singleton爲例。好吧,我真的要改寫它,這樣我就不必有升壓使用它:

template <typename T> 
class Singleton { 
    Singleton (const Singleton<T> &) = delete; 
    Singleton & operator = (const Singleton<T> &) = delete; 
    static Singleton<T> & GetInstanceInternal() { 
     static T instance; 
     return instance; 
    } 
protected: 
    Singleton() {} 
    ~Singleton() {} 
public: 
    static T & GetInstance() { 
     return static_cast<T &>(GetInstanceInternal()); 
    } 
}; 

儘管這使得Singleton<T>單身,什麼是真正想要的是讓T單身。那麼,你可能會說,這是沒有問題的,因爲使用的是T應該Singleton<T>繼承(由Singleton::GetInstanceInternal()被強迫):

class Foo : public Singleton<Foo> { 
public: 
    void foo() { /*...*/ } 
}; 

一個天真的程序員會想!「作業已完成」,因爲自Foo繼承從Singleton<Foo>,這使得Foo單身。但它沒有,因爲它不會阻止此:

Foo x; 

爲了解決這個問題,構造函數應爲私有(因此,要進行Singleton<Foo>需求的朋友)。爲了防止直接調用析構函數,它也應該是私有的。

class Foo : public Singleton<Foo> { 
    friend class Singleton<Foo>; 
    Foo() {} 
    ~Foo() {} 
public: 
    void foo() { /*...*/ } 
}; 

所以,除了繼承Singleton<Foo>有一些繼承本身不能正確執行額外的要求。所有這些要求都可以被記錄下來,但可以認爲使用這些模板變得不那麼有用,並且與將單例功能直接放入Foo幾乎一樣多。