2013-08-28 53 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几乎一样多。