2012-08-01 2 views
2

나는 '은행'클래스와 '분기'클래스를 가지고 있습니다. '지점'은 '은행'에서 상속됩니다. 나는 단지 'Bank'객체가 새로운 'Branch'객체를 생성하는 것을 허용하고자합니다. (예 : citi 그룹 만 citi 은행의 새 지점을 열 수 있음).특정 클래스의 개체 생성을 제한하는 방법

이것을 달성하는 데 가장 좋은 디자인 패턴은 무엇입니까?

현재 개인 생성자와 친구 클래스를 사용하고 있습니다. 그러나 나는 그것이 올바른 방법인지 여부를 확신하지 못합니다.

+0

합리적인 것처럼 보입니다. – Chad

+0

정말로 이것을하고 싶다면,'Branch'에 대한 테스트를 작성하기가 더 어려워 질까요? 아마도 당신이 원하는 것은'Branch' 생성자가'Bank'를 인수로 삼는 것입니다. –

+1

예 테스트가 더 어려워 질 것입니다.하지만 모든 코드는 모든 은행에 할당 할 수 있습니다. 그것은 내가 제한하고자하는 것입니다. – apostopher

답변

2

'지점'은 '은행'

문제가있다, 당신이 사용하고 상속에서 상속됩니다. 추상 팩터 리 패턴을 찾고 있습니다 (Bank은 지점 작성자 임). 분기 생성자는 해당 작성자에게만 액세스 할 수 있습니다.

struct Branch //abstract 
{ 
    virtual ~Branch() = 0; 
}; 
class CitiBranch : Branch 
{ 
    friend class Citi; //only Citi can create instances of CityBranch 
private: 
    CitiBranch(); 
}; 

struct Bank 
{ 
    virtual ~Bank() = 0; 
    virtual Branch* createBranch() = 0; 
} 

struct Citi : Bank 
{ 
    virtual Branch* creatBranch() 
    { 
     return new CityBranch; 
    } 
} 

이 프로그램은 구체적인 클래스가 아닌 인터페이스로 프로그램됩니다. 따라서 Branch 포인터와 Bank 포인터가 있고 정확한 타입을 알 필요가 없습니다.

Bank*이 있고 createBranch()이라면 Branch*이 표시되지만 정확한 콘크리트 개체를 가리 킵니다.

+0

이 작업이 가능합니다. 나는 또한 비슷한 패턴의 친구 및 개인 생성자를 사용하고있다. 나는 'Branch'가 로고, 사명 선언서 등과 같은 'Bank'의 많은 속성을 공유하기 때문에 상속을 사용했습니다 ... – apostopher

+1

@apostopher 그것은 불필요한 정보 복제입니다. 동일한 정보를 가진 많은 브랜치가 있기 때문입니다. Bank 클래스에 정보를 보관하고 분기에 액세스 할 수있게하고 상속하지 않습니다. –

+0

나중에 좋은 생각입니다. 또한 @ DavidRodríguez에 동의합니다. 그래서 상속이 여기에 잘못되었습니다. – apostopher

관련 문제