2011-01-24 1 views
0

:C++ 일반 추상 팩토리 디자인 상담자 현재 일반적인 추상 공장을 설계하고 다음 클래스의 디자인은 밖으로 스케치가하려고 해요

template <typename T> 
class TFactory 
{ 
    public: 
     template <typename A> 
     static T* create(A a); 

     template <typename A, typename B> 
     static T* create(A a, B b); 

     template <typename A, typename B, typename C> 
     static T* create(A a, B b, C c); 

     static T* destory(T* ptr); 
}; 

공장 그때 너무로 사용할 수 있습니다 :

Factory<MyType>::create(1, "hello"); 
Factory<MyType>::create<short, const std::string&>(1, "hello"); 

이것을 설계하는 더 좋은 방법이 있습니까? 이것은 varargs보다 좋지만 최대 10 개의 함수에 대한 오버로드가 여전히 있습니다.

편집 :이 내가 공장 내에서 사용자 정의 메모리 할당을 사용하는 것입니다 위해

나는 이유를 추가해야합니다.

답변

1

Bind 및 Lambda와 같은 Boost 라이브러리에서 이미 수행 된 작업을 찾을 수 있습니다.

Here은 생성자/소멸자 및 새/삭제를 래핑하는 람다 식의 목록입니다. 그 중 하나를 사용하거나 자신의 영감을 얻어 자신의 글을 쓸 수 있습니다.

Factory<MyType>::create(boost::bind(boost::lambda::constructor<MyType>(),1,"hello")); 

난 당신이 방법을 찾을 수 있습니다 확신을 :

다음
template <typename T> class TFactory { 
    public: 
     template <typename A> 
     static T* create(A a) { 
      return new a(); //where a wraps a binded constructor call. 
     }; 
}; 

당신은 다음과 같은 기능을 만들어 사용합니다 :

예를 들어, 람다 생성자를 사용하여 다음과 같은 가질 수 (#define을 사용하여) 더 멋지게 보이게 만들 수 있습니다.

1

가변성 템플릿이 없으면 선행 처리기 남용을 제외하고는 할 수있는 일이 많지 않지만 코드 생성기를 사용하지 않고이 작업을 명확하게 처리 할 수는 없습니다.

휠을 재발 명하지 않으려면 boost::make_shared을보십시오.

그런데 이것은 추상적 인 공장이 아닙니다. 추상 팩토리는 다형성 클래스입니다.