2015년 11월 28일 토요일

Prototype Pattern (원형 패턴)

의도
  • 생성할 객체의 종류를 명세하는 데에 원형이 되는 예시물을 이용하고, 그 원형을 복사함으로써 새로운 객체를 생성하는 패턴
이럴 때 사용하자.
  • 인스턴스화할 클래스를 런타임에 지정할 때(예: 동적로딩)
  • 제품 클래스 계통과 병력적으로 만드는 팩토리 클래스를 피하고 싶을 때
  • 클래스의 인트턴스들이 서로 다른 상태 조합 중에 어느 하나일 때
장점은?
  • 런타임에 새로운 객체를 넣고 빼기가 다른 패턴에 비해 유연하다.
  • 새로운 객체를 정의하는 것이 쉽다.
  • 서브 클래스의 수를 줄일 수 있다.
단점은?
  • 클래스 내부구조가 순환참조를 하고 있는경우 clone함수를 구현하기 어려울 수 있다.
코드
CProduct 클래스
class CProduct
{
public:
   virtual CProduct* Clone() = 0;
};

CPhone, CCar 클래스
class CPhone : public CProduct
{
public:
   CPhone() {};
   CPhone(const CPhone& rPhone) {};
   virtual CProduct* Clone() {
      return new CPhone(*this);
   };
};

class CCar : public CProduct
{
public:
   CCar() {};
   CCar(const CCar& rCar) {};
   virtual CProduct* Clone() {
      return new CCar(*this);
   };
};

실행부분
void main()
{
   CProduct* pPhone1 = new CPhone();
   CProduct* pPhone2 = pPhone1->Clone();

   delete pPhone1;
   delete pPhone2;

   CProduct* pCar1 = new CCar();
   CProduct* pCar2 = pCar1->Clone();

   delete pCar1;
   delete pCar2;
}

UML - class 다이어그램

참고
  • GoF의 디자인 패턴(개정판) 재사용성을 지닌 객체지향 소프트웨어의 핵심요소
  • http://blog.naver.com/icarus_buk/220390625010

댓글 없음:

댓글 쓰기

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