2013-08-28 1 views
0

C++의 우아한 디자인 패턴 (GoF 패턴) 구현은 무엇입니까?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; 
}; 
+2

나는 부스트를 기반으로 한 C++ 싱글 톤 구현을 매우 우아하게 부르지는 않을 것이다 ... –

+2

어, GoF 책을 읽나요? 이 책의 예제는 대부분 C++입니다. – PherricOxide

+0

@Andreas Grapentin Qt 사람들은 부스트 ​​라이브러리를 선호하지 않습니다. 여기 예를 들었습니다. –

답변

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 싱글을 만드는 것입니다. 사용량이 (Singleton::GetInstanceInternal()에 의해 강제로) TSingleton<T>에서 상속해야하기 때문에 글쎄, 당신은,이 문제가되지 않습니다, 말할 수 있습니다

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에 넣는 것만 큼 많은 작업이 필요하다고 주장 할 수 있습니다.