2010-12-16 3 views
2

클래스 EventManager의 인스턴스 인 클래스 Command이 있습니다. 클래스 명령은 생성자에 두 개의 인수 (host, target)가 필요합니다. 타겟팅 클래스의 멤버 함수는이 메소드 cmd->Execute()를 사용해야하는 경우ctor에 인수가 필요한 싱글 톤 클래스

class EventManager 
{ 
public: 
    void Event1(){ cmd->Execute(_eventEnum); } 
private: 
    Command *cmd; 
}; 

class Command 
{ 
public: 
    Command(Host h, Target t) 
    void Execute(); 
private: 

} 

은 이제, cmd 대상의 인스턴스 변수를 확인하거나 단독으로 글로벌하게 할 필요가있다.

호스트 인스턴스를 사용하지 않기 때문에 cmd을 대상의 인스턴스 변수로 사용할 수 없습니다. 그것을 확인하기 위해 싱글 내가 GetInstanceCreateInstance 후에 호출되어 있는지 확인하기 위해 필요한이

class Command 
{ 
public: 

    CreateInstance(Host h, Target t); 
    GetInstance(); 
    void Execute(); 
private: 
    Command(Host h, Target t); 

} 

같은 두 가지 방법을 추가하는 것입니다. 다른 대안?

대상 클래스는 이벤트가 적은 하위 수준 클래스입니다.

Target::LowlevelEvent() 
{ 
cmd->Execute(lowlevelevent) //In Execute for lowlevelevent in Command class, i might call target->reset 
} 

이암은 분명히 설명 할 수 없기 때문에 죄송합니다. 문제는이 코드에는 EventManager 또는 Target과 같은 클래스에있을 수있는 많은 이벤트 (메서드)가 있다는 것입니다.

이러한 각 이벤트에서 Command-> Execute()를 호출해야합니다. 명령 클래스에는 특정 조치를 수행 할 수 있기 때문에 호스트 및 대상 인스턴스가 필요합니다.

EventManager :: Event1() { cmd-> Execute (_event1); }

대상 :: Event2() { cmd-> Execute (_event2); }

명령 : 실행 (이벤트 전자) { 경우 (_event1 == 전자) { 호스트 -> 호출 액션(); } if (_event2 == e) { target-> CallSomeOtherAction(); }

이제 cmd는 EventManager와 Target 모두의 인스턴스 변수 여야합니다. 이제 EventManager에는 Command ctor에 전달할 수있는 호스트 및 대상 인스턴스가 있습니다.

하지만 대상에 호스트에 대한 액세스 권한이 없습니다. 그래서 나는 Target 클래스에서 Command 인스턴스를 생성 할 수 없다.

그래서 EventManager ctor에서 싱글 톤을 생성하는지 궁금합니다. 그런 다음 대상에서 GetInstance()를 호출합니다. 나는 그 나쁜 생각을 안다. 그러나이 거대한 디자인으로, 나는 알아낼 수 없다. 당신의 도움을 주셔서 감사합니다.

+1

'코드에 따라'EventManager'의 인스턴스가 아닌 Command' 또한 어떤'Target' 모습입니까? 당신은 코드 예제를 수정해야합니다 ... – Nim

+0

나는 이것이 디자인 문제에 더 가깝다고 생각합니다. 명령을 싱글 톤으로 만드는 것은 하나의 명령 만 가질 수 있음을 의미합니다. 또한 Target은 스스로 명령을 실행해서는 안됩니다. –

+0

[싱글 톤 디자인을 피하십시오] (http://www.techradar.com/news/software/applications/10-mistakes-every-programmer-makes-909424)를 시도해야합니다. – Default

답변

5

나는 정말로 당신의 문제를 이해하지 못한다. 그러나 제목에서 나는 이것을 말할 수있다 : 싱글 톤을 사용하지 말라. 인수가 필요하다는 사실은 싱글 톤 패턴에 대한 꽤 좋은 카운터 지표입니다.

모든 명령이 동일한 매개 변수로 생성되도록하려면 클라이언트에 명령 인스턴스를 생성하는 CommandFactory을 제공 할 수 있습니다.

class CommandFactory { 
public: 
    CommandFactory(std::string host, std::string target) 
     : m_host(host), 
      m_target(target) 
    {} 

    boost::shared_ptr<Command> createCommand() { 
     return boost::shared_ptr<Command>(new Command(m_host, m_target)); 
    } 
private: 
    std::string m_host; 
    std::string m_target; 
}; 

그런 다음 당신은 또한 객체를 재사용 할 수 object pool의 일종을 구현할 수 있습니다.

0

절대적으로 Command 싱글을 만들 필요가 없습니다. 적절한 매개 변수를 필요로 할 때 인스턴스를 생성하고 관리자에게 전달하여 사용하고 제거하십시오. 아마도 전달하기를 원하므로 shared_ptr을 사용하는 것이 좋습니다.