최상단 광고

2012년 4월 17일 화요일

[Chapter5] 생성 패턴 - 원형(프로토타입)

1. 원형(프토로타입) 패턴이란?
  프로토타입 패턴(prototype pattern)은 생성할 객체들의 타입이 프로토타입인 인스턴스로부터 결정되도록 하며, 인스턴스는 새 객체를 만들기 위해 자신을 복제(clone)하게 된다. 프로토타입 패턴은 추상 팩토리 패턴과는 반대로, 클라이언트 응용 프로그램 코드 내에서 객체 창조자(creator)를 서브클래스(subclass)하는 것을 피할 수 있게 해준다.  프로토타입 패턴은 새로운 객체는 일반적인 방법(예를 들어, new를 사용해서라든지)으로 객체를 생성(create)하는 고유의 비용이 주어진 응용 프로그램 상황에 있어서 불가피하게 매우 클 때, 이 비용을 감내하지 않을 수 있게 해준다. 패턴을 구현하려면, 우선 clone() 메소드를 선언하는 추상 베이스 클래스를 하나 만든다. 다형적 생성자(polymorphic constructor) 기능이 필요한 클래스가 있다면, 그것을 앞에서 만든 클래스를 상속받게 한 후, clone() 메소드 내의 코드를 구현한다.


2. 원형 패턴은 언제 사용되는가?
제품의 생성, 복합, 표현 방법에 독립적인 제품을 만들고자 할 때
- 어떤 클래스의 인스턴스를 만드는 것이 자원/시간을 많이 잡아먹거나 복잡 할 때
- 모두 클래스로 만들기에는 종류가 너무 많은 경우
인스턴스 생성이 어려운 경우(인스턴스화할 클래스를 런타임에 지정할 때, 동적 로딩)- framework와 생성하는 인스턴스를 분리하고 싶은 경우
- 제품 클래스 계통과 병렬적으로 만드는 팩토리 클래스를 피하고 싶을 때
클래스의 인스턴스들이 서로 다른 상태 조합 중에 어느 하나일 때
미리 원형으로 초기화해 두고, 나중에 이를 복제해서 사용하는 것이 매번 필요한 상태 조합의 값들을 수동적으로 초기화하는 것보다 편리 할 수도 있습니다.


3. 원형 패턴의 다이어그램



☆ Prototype
:  자신을 복제하는 데 필요한 인터페이스를 정의합니다.

☆ ConcretePrototype
: 자신을 복제하는 연산을 구현합니다.

☆ Client
: 원형에 자기 자신의 복제를 요청하여 새로운 객체를 생성합니다.


4. 원형 패턴을 쓰면..
1) 런타임에 새로운 제품을 추가하고 삭제할 수 있습니다.
: 원형 패턴을 이용하면 사용자에게 원형으로 생성되는 인스턴스를 등록하는 것만으로도 시스템에 새로운 제품 클래스르 추가할 수 있게 됩니다. 런타임에 새로운 원형을 넣고 빼기가 쉽다는 접에서 다른 생성 패턴에 비해 유연성을 지니고 있습니다.

2) 값들을 다양화함으로써 새로운 객체를 명세합니다.
: 고도로 동적화된 시스템에서는 새로운 클래스를 생성할 필요 없이 객체 합성으로 새로운 행동을 정의할 수 있습니다. 객체의 변수가 다른 클래스에 대한 참조자를 정의하고 있다면, 이 참조자가 합성한 새로운 클래스만 정의하고, 그 클래스에 인스턴스에 대한 참조자만을 넘겨주면, 새로운 행동이 정의되는 것처럼 보인다는 것입니다.

3) 구조를 다양화함으로써 새로운 객체를 명세할 수 있습니다.
: 많은 응용프로그램은 구성요소와 부분 구성요소의 복합을 통해 객체를 구축합니다. 예를 들어, 회로설계를 위한 편집기는 세부 회로를 모아서 큰 회로를 만듭니다. 이런 응용프로그램에서는 편의를 위한 복잡한 사용자 정의 구조를 사용자가 인스턴스화 하여 그 상황에 맞는 세부 회로를 계속 이용할 수 있도록 배려해 줄 때가 많습니다. 복합 회로 객체가 Clone() 연산을 구현함으로써 다른 구조를 갖는 회로의 기본 골격을 만듭니다.

4) 서브클래스의 수를 줄입니다.
: 팩토리 메서드를 보면 Creator 클래스의 계통이 처리할 제품 관련 클래스의 계통과 병렬로 복합되는 것을 알 수 있습니다. 원형 패턴에서는 팩토리 메서드에 새로원 객체를 만들어 달라고 요청하는 것이 아니라 원형을 복제하는 것으로, Creator 클래스에 따른 새로운 상속 계층이 필요 없습니다.

5) 동적으로 클래스에 따라 응용프로그램을 설정할 수 있습니다.
: 몇몇 런타임 환경에서는 동적으로 클래스들을 응용프로그램으로 등록할 수 있도록 해 줍니다. 동적으로 로드된 클래스의 인스턴스를 생성하고 싶은 응용프로그램은 정적으로 그 클래스이 생성자를 참조할 수 없습니다. 그 대신 런타임 환경이 그 클래스의 인스턴스를 자동으로 생성하고 원형 관리자에게 등록합니다. 그러면 응용프로그램은 이 원형 관리자에게서 필요한 클래스의 인스턴스를 얻게 됩니다.


§ 관련 패턴 §
: 원형 패턴과 추상 팩토리 패턴은 어떤 면에서는 경쟁적인 관계입니다. 하지만 함게 사용 될 수도 있습니다. 추상 팩토리 패턴은 원형 집합을 저장하다가 필요할 때 복제하여 제픔 객체를 반환하도록 사용할 수 도 있습니다. 만약 복합체 패턴과 장식자 패턴을 많이 사용해야 하는 설계에서 원형 패턴을 쓰면 종종 재미를 볼 수 있습니다.

댓글 없음: