문제

나는 이것에 대한 공식 이름이 있는지는 모르겠지만, 나는 "자기 공장"패턴이라고 부르는 것을 가지고 놀았습니다. 기본적으로 추상 기본 클래스가 그 자체로 공장 역할을 할 때입니다. 설명하겠습니다 :

내 시스템에는 Foo Objects and Bar Objects가 있으며 인터페이스 Foointerface 및 Barinterface를 통해 사용됩니다. 고객에게 올바른 유형의 foo와 bar를 제공해야합니다. 어떤 콘크리트 foo 개체를 만들 겠다는 결정은 컴파일 시간에 이루어집니다. 예를 들어, Win32에서 컴파일하면 Win32Foo 객체 만 생성하고 OSX에서 컴파일하면 OSXFOO 객체 만 생성하려고합니다. 그러나 어떤 콘크리트 막대 개체를 작성 해야하는지 결정은 런타임에 주요 문자열을 기반으로 이루어집니다.

이제 제 질문은이 체계를 구현하는 가장 좋은 방법에 관한 것입니다. 내가 생각하는 한 가지 방법은 일반 공장을 사용합니다.

shared_ptr<FooInterface> foo = FooFactory::create();
shared_ptr<BarInterface> happyBar = BarFactory::create("Happy");
shared_ptr<BarInterface> sadBar = BarFactory::create("Sad");

또 다른 방법은 내가 "Self-Factories"라고 부르는 것을 사용하는 것입니다.

shared_ptr<FooInterface> foo = FooInterface::create();
shared_ptr<BarInterface> happyBar = BarInterface::create("Happy");
shared_ptr<BarInterface> sadBar = BarInterface::create("Sad");

유용성 관점과 건축 적 관점에서 각 접근 방식의 장단점은 무엇입니까?

도움이 되었습니까?

해결책

공장은 두 가지 일반적인 용도를 가지고 있습니다.

1) 매개 변수 및/또는 글로벌 상태 (예 : 구성)를 기반으로 런타임시 동적 다형성 유형을 결정하십시오. 당신의 패턴이 이것을합니다.

2) 종속성 주입 : 정적 기능을 사용하여 개체를 만드는 대신 공장을 사용하십시오. 물체, 반환 된 객체의 유형을 원하는 공장을 통과시켜 발신자가 구성 할 수 있도록 발신자가 구성 할 수 있습니다. 이 패턴 중 어느 것도 이것을 제공하지 않습니다. 또한 두 번째 패턴은 인터페이스와 공장이 동일하기 때문에 정적 의존성 주입 (템플릿 매개 변수로 공장 클래스를 취하는 템플릿 함수를함으로써)을 허용하지 않습니다.

따라서 귀하의 패턴 (및 일반 공장) 중 하나는 종속성 주입이 실제로 지원되지 않는다는 것입니다. foointerface 인 객체를 얻기 위해 호출 할 기능이 하나이며, foointerface :: create ()입니다. 나는 종속성 주입이 왜 유용한 지에 대해 논쟁하지 않을 것입니다.이 방법을 구축하면 사용할 수 없다고 지적합니다.

다른 팁

나는 개선 할 것이다 :

shared_ptr<FooInterface> foo = Factory<FooInterface>::create();
shared_ptr<BarInterface> happyBar = Factory<BarInterface>::create("Happy");
shared_ptr<BarInterface> sadBar = Factory<BarInterface>::create("Sad");

당신은 선언 할 것입니다 :

template <class I>
struct Factory { };

그런 다음 공장이 필요한 각 인터페이스에 대해 다음을 수행합니다.

template <>
struct Factory<FooInterface>
{
    static FooInterface create();
};

이를 통해 공장 구현을 인터페이스 선언과 별도로 유지할 수 있지만 여전히 유형 시스템을 사용하여 컴파일 시간에 바인딩 할 수 있습니다.

일반적으로 공장은 전체 클래스 계층 구조의 객체를 만드는 책임이 있습니다. 따라서 예에서는 Win32Factory, OsxFactory 등이 있습니다. 이것의 장점 중 하나는 공장 생성 중에 특정 구현 (Win32/UNIX/등)을 선택해야한다는 것입니다. 항상 OS 정보를 제공합니다.

두 개의 클래스 만 있다면 (foo 및 bar), 나는 그들을 위해 공장을 만들고 단지 사용하지 않는 것이 가치가 있다면 확실하지 않습니다. create 인터페이스의 방법.

아, 그리고 인터페이스에 유형의 객체를 만드는 메소드가 있으면 공장 방법 패턴.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top