Search
♻️

[디자인 패턴 - 생성 패턴] 프로토 타입 패턴 (Prototype)

1. 의도

GoF
원형이 되는 (prototypical) 인스턴스를 사용하여 생성할 객체의 종류를 명시하고, 이렇게 만든 견본을 복사해서 새로운 객체를 생성합니다.

2. 활용성

GoF
제품의 생성, 복합, 표현 방법에 독립적인 제품을 만들고자 할 때 사용
인스턴스화할 클래스를 런타임에 지정할때 (동적 로딩)
제품 클래스 계통과 병렬적으로 만드는 팩토리 클래스를 피하고 싶을때
클래스의 인스턴스들이 서로 다른 상태 조합중에 어느 하나일때
미리 프로토타입으로 초기화한 후 복제해서 사용
Head First
특징
클라이언트 코드에서 어떤 클래스의 인스턴스를 만드는지 전혀 모른상태에서도 인스턴스를 만들 수 있음
시스템의 복잡한 클래스 계층 구조에 파묻혀 있는 다양한 형식의 객체 인스턴스를 새로 만들어야할 때 유용할 수 있음
클래스 뿐만 아니라 상태도 같이 복제
장점
클라이언트는 새로운 인스턴스를 만드는 과정을 몰라도 됨
클라이언트는 구체적인 형식을 몰라도 객체 생성 가능
상황에 따라 객체를 새로 생성하는 것보다 복사하는게 더 효율적일 수 있음
단점
때때로 객체의 복사본을 만드는 일이 매우 복잡할 수 도 있음

3. 구조

UML Class Diagram

4. 참여자

참여자
역할
예시
Prototype
자신을 복제하는데 필요한 인터페이스 정의
ConcretePrototype
자신을 복제하는 연산을 구현
Client
Prototype에 자기 자신 복제를 요청하여 새로운 객체 생성

5. 협력 방법

사용자는 원형 클래스 스스로에 복제를 요청합니다.

6. 결과

추상 팩토리 및 빌더와 비슷한 결과를 낳습니다. 사용자쪽에서는 어떠한 구체적인 제품이 있는지 알리지 않아도 되기 때문에 사용자 쪽에서 상대해야하는 클래스 수가 적습니다. 게다가 수정하지 않고도 응용프로그램에 따라 필요한 클래스들과 동작할 수 있게 됩니다.
런타임에 새로운 제품을 추가하고 삭제할 수 있습니다.
사용자에게 프로토 타입으로 생성되는 인스턴스를 등록하는 것만으로도 시스템에 새로운 제품 클래스 추가 가능
다른 생성 패턴에 비해 유연성을 지님
값들을 다양화함으로써 새로운 객체를 명세
새로운 클래스를 생성할 필요 없이 객체 합성으로 새로운 행동 정의 가능
구조화를 다양화함으로써 새로운 객체 명세 가능
서브 클래스의 수를 줄임
팩토리 메서드 패턴은 팩토리 메서드에 새로운 객체를 만들어 달라고 요청함
프로토타입 패턴은 프로토타입을 복제하는 것이므로 새로운 상속이 필요 없음
동적으로 클래스에 따라 응용프로그램 설정 가능
프로토타입의 서브클래스가 Clone() 연산을 구현해야하는 점을 신경써야 함

7. 예시 코드

Monster* ghostPrototype = new Ghost(15, 3); Spawner* ghostSpawner = new Spawner(ghostPrototype);
TypeScript
복사
var beget = (function () { function F() {} return function ( proto ) { F.prototype = proto; return new F(); }; })();
TypeScript
복사
var vehiclePrototype = { init: function ( carModel ) { this.model = carModel; }, getModel: function () { console.log( "The model of this vehicle is.." + this.model); } }; function vehicle( model ) { function F() {}; F.prototype = vehiclePrototype; var f = new F(); f.init( model ); return f; } var car = vehicle( "Ford Escort" ); car.getModel();
TypeScript
복사