- 객체를 생성하는 인터페이스는 미리 정의하고, 인스턴스를 만들 클래스의 결정은 서브클래스 쪽에서 내리는 패턴
- 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때
- 생성할 객체를 기술하는 책임을 자신의 서브클래스가 지정했으면 할 때
- 객체 생성의 책임을 몇 개의 보조 서브글래스 가운데 하나에게 위임하고, 어떤 서브클래스가 위임자인지에 대한 정보를 국소화시키고 싶을 때
- 어떤 객체를 생성할 것인지와는 무관하게 동일한 형태로 프로그래밍이 가능하다.
- 클라이언트가 직접 객체를 생성하는 것보다 유연한 확장성 구조를 가지게 된다.
- 서로 연관된 클래스들의 상속관계가 병렬로 존재하는 경우 한 쪽 상속 관계의 클래스들이 다른 쪽 상속 관계의 클래스 객체를 생성할 때 유용하다.
- 상속관계에 있는 클래스들의 멤버 함수가 동일한 프로그램 로직을 가지고 있으면서 내부적으로 생성할 객체만 서로 다를 때 편리하다.
- 객체의 종류가 달라질 때마다 새로운 하위 클래스를 정의해야한다
CProduct 클래스
class CProduct { public: CProduct() {}; virtual ~CProduct() {}; virtual string ToString() = 0; };
CPhone 클래스
class CPhone : public CProduct { public: CPhone(string strName, int nPrice) { m_strName = strName; m_nPrice = nPrice; }; virtual ~CPhone() {}; virtual string ToString() { ostringstream sout; sout << "Name: " << m_strName << ", Price: $" << m_nPrice; return sout.str(); } private: string m_strName; int m_nPrice; };
CFactory 클래스
class CFactory { public: CFactory() {}; virtual ~CFactory() {}; virtual CProduct* MakeProduct() = 0; };
CPhoneFactory 클래스
class CPhoneFactory : public CFactory { public: CPhoneFactory(string strName, int nPrice) { m_strName = strName; m_nPrice = nPrice; }; virtual ~CPhoneFactory() {}; CProduct* MakeProduct() { return new CPhone(m_strName, m_nPrice); } private: string m_strName; int m_nPrice; };
실행부분
void main() { auto_ptr<CFactory> apPhoneFactory(new CPhoneFactory("Phone1", 20)); auto_ptr<CProduct> apPhone(apPhoneFactory->MakeProduct()); cout << apPhone->ToString() << endl; }
UML - class 다이어그램
참고
- GoF의 디자인 패턴(개정판) 재사용성을 지닌 객체지향 소프트웨어의 핵심요소
- http://taegony.tistory.com/48
댓글 없음:
댓글 쓰기
참고: 블로그의 회원만 댓글을 작성할 수 있습니다.