2015년 11월 27일 금요일

Factory Method Pattern (팩토리 메소드 패턴)

의도
  • 객체를 생성하는 인터페이스는 미리 정의하고, 인스턴스를 만들 클래스의 결정은 서브클래스 쪽에서 내리는 패턴
이럴 때 사용하자.
  • 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때
  • 생성할 객체를 기술하는 책임을 자신의 서브클래스가 지정했으면 할 때
  • 객체 생성의 책임을 몇 개의 보조 서브글래스 가운데 하나에게 위임하고, 어떤 서브클래스가 위임자인지에 대한 정보를 국소화시키고 싶을 때
장점은?
  • 어떤 객체를 생성할 것인지와는 무관하게 동일한 형태로 프로그래밍이 가능하다.
  • 클라이언트가 직접 객체를 생성하는 것보다 유연한 확장성 구조를 가지게 된다.
  • 서로 연관된 클래스들의 상속관계가 병렬로 존재하는 경우 한 쪽 상속 관계의 클래스들이 다른 쪽 상속 관계의 클래스 객체를 생성할 때 유용하다.
  • 상속관계에 있는 클래스들의 멤버 함수가 동일한 프로그램 로직을 가지고 있으면서 내부적으로 생성할 객체만 서로 다를 때 편리하다.
단점은?
  • 객체의 종류가 달라질 때마다 새로운 하위 클래스를 정의해야한다
코드
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

댓글 없음:

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.