2015년 11월 24일 화요일

Builder Pattern (빌더 패턴)

의도
  • 복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 분리하여, 서로 다른 표현 결과를 만들 수 있게 하는 패턴
이럴 때 사용하자.
  • 복합 객체의 생성 알고리즘이 이를 합성하는 요소 객체들이 무엇인지 이들의 조립 방법에 독립적일 때
  • 합성 할 객체들의 표현이 서로 다르더라도 생성 절차에서 이를 지원해야 할 때
장점은?
  • 제품에 대한 내부 표현을 다양하게 변화할 수 있다.
  • 생성과 표현에 필요한 코드를 분리한다.
  • 복합 객체를 생성하는 절차를 좀 더 세밀하게 나눌 수 있다.
코드
CProduct 클래스
class CProduct
{
public:
   CProduct() {};
   ~CProduct() {};

public:
   string m_strName;
   bool m_bDMB;
   int m_nPrice;
};

CProudctBuilder 클래스
class CProductBuilder
{
public:
   virtual void BuildProduct() {};
   virtual void BuildName(string strName) {};
   virtual void BuildDMB(bool bDMB) {};
   virtual void BuildPrice(int nPrice) {};

   virtual CProduct* GetProduct() { return 0; };

protected:
   CProductBuilder() {};
};

CPhoneBuilder, CPhoneTestBuilder 클래스
class CPhoneBuilder : public CProductBuilder
{
public:
   CPhoneBuilder() {};

   virtual void BuildProduct() { pPhone = new CProduct; };
   virtual void BuildName(string strName) { pPhone->m_strName = strName; };
   virtual void BuildDMB(bool bDMB) { pPhone->m_bDMB = bDMB; };
   virtual void BuildPrice(int nPrice) { pPhone->m_nPrice = nPrice; };

   virtual CProduct* GetProduct() { return pPhone; };

private:
   CProduct* pPhone;
};

class CPhoneTestBuilder : public CProductBuilder
{
public:
   CPhoneTestBuilder() {};

   virtual void BuildProduct() { cout << "Start Testing..." << endl << "Create Phone" << endl; };
   virtual void BuildName(string strName) { cout << "Name : " << strName.c_str() << endl; };
   virtual void BuildDMB(bool bDMB) { cout << "DMB : " << (bDMB ? "O" :"X") << endl; };
   virtual void BuildPrice(int nPrice) { cout << "Price : $" << nPrice << endl; };

   virtual CProduct* GetProduct() { cout << "Finish Testing" << endl;  return 0; };
};

CManufacturer 클래스
class CManufacturer {
public:
   void CreateProduct(CProductBuilder& rProductBuilder) {
      rProductBuilder.BuildProduct();
      rProductBuilder.BuildName("Phone1");
      rProductBuilder.BuildPrice(100);
   };
};

실행 부분
void main()
{
   CManufacturer Manufacturer;

   CPhoneTestBuilder PhoneTestBuilder;
   Manufacturer.CreateProduct(PhoneTestBuilder);
   PhoneTestBuilder.GetProduct();

   cout << endl << endl;

   CPhoneBuilder PhoneBuilder;
   Manufacturer.CreateProduct(PhoneBuilder);
   auto_ptr<CProduct> apProduct(PhoneBuilder.GetProduct());
   cout << "Name : " << apProduct->m_strName.c_str() << ", Price : " << apProduct->m_nPrice << endl;
}

UML - class 다이어그램
참고
  • http://seungdols.tistory.com/entry/GoF%EC%9D%98-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-%EC%83%9D%EC%84%B1-%ED%8C%A8%ED%84%B4
  • http://tadis.tistory.com/entry/7-%EC%83%9D%EC%84%B1%ED%8C%A8%ED%84%B4-2-%EB%B9%8C%EB%8D%94-Builder-1
  • http://blog.naver.com/jak500/220281491215

댓글 없음:

댓글 쓰기

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