0

c++ 中优雅的设计模式(GoF 模式)实现是什么?

谁能给我一些基于模板的设计模式实现示例(可以重用)?

示例(基于模板的单例):-

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;
};
4

2 回答 2

1

看看 Alexandrescu 的 Modern C++ Design

http://www.amazon.com/Modern-Design-Generic-Programming-Patterns/dp/0201704315

他涵盖了几种设计模式的模板实现。事实上,IIRC 的前言之一是由 GOF 之一编写的。

于 2013-08-28T20:35:14.960 回答
1

以我的经验,真的没有好的设计模式模板库。如果没有警告或对试图将自己插入其中的类施加难以实施的限制,设计模式很难被正确地捕获为具体模板。

让我们举个Singleton例子。好吧,我实际上要重写它,这样我就不必使用 Boost 来使用它:

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直接将单例功能放入其中一样多。

于 2013-08-28T20:52:49.217 回答