문제

다음과 같은 수업이 있다고 가정 해 봅시다.

class MonkeyFish
{
   MonkeyFish( GlobalObjectA & a, GlobalObjectB & b, GlobalObjectC & c);

   private:
     GlobalObjectA & m_a;
     GlobalObjectB & m_b;
     GlobalObjectC & m_c;
}

공장이 없으면 나는 MonkeyFish.

GlobalObjectA a;
GlobalObjectB b;
GlobalObjectC c;

int main()
{
  MonkeyFish * monkey_fish = new MonkeyFish(a, b, c);
  monkey_fish->go();
}

반면에, 내가 있다면 MonkeyFishFactory, 내가 이것을 해야하는 것 같다 :

GlobalObjectA a;
GlobalObjectB b;
GlobalObjectC c;

int main()
{
  MonkeyFishFactory mf_factory(a, b, c);
  MonkeyFish * monkey_fish = mf_factory.buildMonkeyFish("Bob");
  monkey_fish->go();
}
  1. 나는 여전히 글로벌 대상이 있습니다.

  2. Monkeyfishfactory 자체가 만들어 지더라도 GlobalObjects 내부적으로 (그래서 그들은 이제 진정한 글로벌 대신 원숭이 피쉬 factory 내부에 있습니다), 그것은 원숭이 피쉬 factory처럼 보입니다. 그 자체 내가 만들고 싶을 때마다 액세스 할 수 있도록 여전히 글로벌 객체 여야합니다. MonkeyFish.

이 경우 공장 패턴이 글로벌 상태와 동일하지 않습니까?

(저는 현재 글로벌 국가가 나쁜 것이라는 가정하에 운영되고 있으며, 그것을 제거하는 것이 좋은 것입니다.)

도움이 되었습니까?

해결책

여기서 개념을 혼동하고 있습니까?

공장 패턴은 일반적으로 추상 인터페이스 뒤에 숨어있는 콘크리트 클래스 인스턴스를 반환 할 때 적용됩니다. 아이디어는 발신자가 인터페이스 만 볼 것이며 객체의 콘크리트 유형이 무엇인지 알 필요조차 없다는 것입니다. 매개 변수를 기반으로 객체 인스턴스를 생성하고 객체를 생성하는 사용자로부터 어떤 개체를 작성하는지 결정하는 것과 관련된 논리를 분리하는 것입니다.

당신이 묘사하는 것은 싱글 톤 (또는 단일 자극)과 공장의 혼합입니다. 공장에는 상태가 있으므로 정적으로 만들 수 없습니다. 이 경우 싱글 톤 패턴과 같은 것을 적용하여 적절한 글로벌이 숨겨져있는 단일 공장 인스턴스의 생성을 제어해야합니다.

class IMonkeyFish {
public:
    virtual ~IMonkeyFish() = 0;
    virtual void go() = 0;
};

class Factory {
public:
    static Factory& instance();
    IMonkeyFish* createMonkeyFish();
protected:
    Factory(GlobalObjectA& a, GlobalObjectB& b, GlobalObjectC& c);
private:
    static Factory *theInstance;
    GlobalObjectA&  instanceOfA;
    GlobalObjectB&  instanceOfB;
    GlobalObjectC&  instanceOfC;
};

Factory& factory = Factory::instance();
IMonkeyFish* fishie = factory.createMonkeyFish();
fishie->go();

그만큼 Singleton 패턴은 공장 인스턴스의 생성을 관리합니다. 그만큼 Factory 패턴은 IMonkeyFish 상호 작용. 좋은 점 (TM)은 글로벌 상태를 숨기고 분리하는 것입니다. MonkeyFish 인스턴스 생성의 구체적인 세부 사항.

사용의 사용 또는 정확성 Singleton 그래도 물건은 완전히 다른 문제입니다. 아마도 그것에 대해 떠 다니는 실도 많이있을 것입니다.

다른 팁

글로벌 국가는 그 자체로 나쁜 것이 아닙니다. 공공의 글로벌 상태는 나쁜 것입니다. 공장 패턴은 글로벌 상태를 캡슐화하는 데 도움이됩니다.

공장에는 글로벌 상태가 없습니다. 그것은 단지 객체를 만듭니다. 공장의 어떤 상태도 아니기 때문에. 글로벌이 되어도 괜찮습니다.

당신은 글로벌 물건을 떠날 필요가 없습니다. Monkey Fish Factory는 주문형 Globalojecta | B | C를 만들어야합니다. 스위치를 사용하거나 내부 메소드를 사용하여 어느 것을 결정합니다.

공장에서 물체 생성에 대한 제어를 캡슐화했습니다. 당신은 당신의 인스턴스화 세부 사항이 숨겨지기를 원하며, 새로운 원숭이 피쉬가 필요한 곳마다 재현하지 않기를 원합니다. 테스트, 단일 책임 및 Demeter의 법칙에 대해 생각해보십시오. 원숭이 피쉬를 사용하려는 수업이 왜 구축하는 데 필요한 일에 대해 무엇이든 알아야하는 이유는 무엇입니까? 원숭이 피쉬를 테스트하고 싶다면 어떻게해야합니까? 창조 세부 사항이 캡슐화되지 않았다면 어떻게 하시겠습니까?

공장 수업의 임무는 객체를 인스턴스화하고 발신자에게 전달하는 것입니다. 사용할 글로벌 인스턴스형 개체를 선택하지 마십시오. 따라서 공장 예제가 잘못되었습니다. 그것은해야한다:

int main()
{
  MonkeyFish * monkey_fish = MonkeyFishFactory::buildMonkeyFish("Bob");
  monkey_fish->go();
}

통지, 글로벌 대상은 없으며 원숭이 피쉬 포도는 인스턴스화되지 않습니다.

나는 당신이 공장 패턴이 아니라 싱글 톤 패턴을 생각하고 있다고 생각합니다. 싱글 톤 패턴에서 당신은 클래스의 예를 들어, 기본적으로 글로벌 변수가 첨부되지 않는 것을 제외하고는 글로벌 객체와 동일하게 만듭니다.

좋은 답변을 얻으려면 제약과 요구 사항을 진술해야합니다. 좋은 대답을 얻는 가장 중요한 것은 어떤 질문을 해야하는지 아는 것입니다.

코드 스 니펫에서 귀하는 Globals를 사용하기로 결정했지만 공장을 사용하는지 여부와 관련이 없습니다. 여전히 그 글로벌에 의존하는 공장을 사용하는 경우 나머지와 함께 쌓을 다른 코드가 있습니다.

당신이 달성하려는 것을 명확하게 말하면 더 나은 답을 얻을 것입니다.

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