프로토타입 패턴 - 위키백과, 우리 모두의 백과사전 프로토타입 패턴 위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 프로토타입 패턴 ( prototype pattern ) 은 소프트웨어 디자인 패턴 용어로, 생성할 객체들의 타입이 프로토타입인 인스턴스로부터 결정되도록 하며, 인스턴스는 새 객체를 만들기 위해 자신을 복제 ( clone ) 하게 된다. 프로토타입 패턴은, 추상 팩토리 패턴과는 반대로, 클라이언트 응용 프로그램 코드 내에서 객체 창조자 ( creator ) 를 서브클래스 ( subclass ) 하는 것을 피할 수 있게 해준다. 프로토타입 패턴은 새로운 객체는 일반적인 방법 ( 예를 들어, new를 사용해서라든지 ) 으로 객체를 생성 ( create ) 하는 고유의 비용이 주어진 응용 프로그램 상황에 있어서 불가피하게 매우 클 때, 이 비용을 감내하지 않을 수 있게 해준다. 패턴을 구현하려면, 우선 clone 메소드를 선언하는 추상 베이스 클래스를 하나 만든다. 다형적 생성자 ( polymorphic constructor ) 기능이 필요한 클래스가 있다면, 그것을 앞에서 만든 클래스를 상속받게 한 후, clone 메소드 내의 코드를 구현한다. 구조 목차 1 원칙 2 예제 2. 1 C 2.
uctor ) 기능이 필요한 클래스가 있다면, 그것을 앞에서 만든 클래스를 상속받게 한 후, clone 메소드 내의 코드를 구현한다. 구조 목차 1 원칙 2 예제 2. 1 C 2. 2 C # 2. 3 Java 2. 4 Python 2. 5 PHP 3 같이 보기 4 각주 원칙 [ 편집 ] 객체 생성과 관련된 패턴들은 서로 영역이 겹치는 면이 있다. 프로토타입 패턴과 추상 팩토리 패턴 중 어느 하나가 적용될 수 있는 경우가 있다. 추상 팩토리 패턴이 프로토타입들의 집합을 갖고있다가, 클론 ( clone ) 한 뒤 프로덕트 ( product ) 객체를 반환할 수도 있다. [ 1 ] : 126쪽 추상 팩토리 패턴, 빌더 패턴, 프로토타입 패턴은 각 구현에 있어서 싱글턴 패턴을 활용할 수 있다. [ 1 ] : 81쪽 : 134쪽 다시 말해 추상 팩토리 클래스는 종종 팩토리 메소드과 함께 구현하거나 [ 2 ], 프로토타입을 이용해서 구현되기도 한다. [ 3 ] 보통 설계는 처음에는 팩토리 메소드로 출발한다. 다음에 설계자의 재량에 따라 추상 팩토리 패턴, 빌더 패턴, 프로토타입 패턴으로 바뀔 수 있다. [ 1 ] : 136쪽 프로토타입은 서브클래싱을 필요로 하지 않
메소드로 출발한다. 다음에 설계자의 재량에 따라 추상 팩토리 패턴, 빌더 패턴, 프로토타입 패턴으로 바뀔 수 있다. [ 1 ] : 136쪽 프로토타입은 서브클래싱을 필요로 하지 않는다. 하지만 " 초기화 " 동작을 필요로 한다. 팩토리 메서드 패턴은 서브클래싱을 필요로 하나, " 초기화 " 동작은 필요로 하지 않는다. 설계자는 컴포지트 패턴이나 데코레이터 패턴을 매우 많이 사용한 무거운 설계를 프로토타입을 사용하여 더 좋게 만들 수 있다. 원칙은 " " 에 또 다른 " 객체 " 를 생성한다는 것이다. 다시 말해 이 시점에 가서 클로닝 ( cloning ) 을 하는 객체의 " 실제 복사본 " 이 만들어지는 것이다. " 실제 복사본 " 이라는 말은 새로 생성되는 객체가 클로닝 ( cloning ) 당하는 객체의 애트리뷰트와 똑같은 애트리뷰트를 가질 것이라는 말이다. 반면에, " new " 를 이용해 객체를 생성했다면, 새로이 생성된 객체의 애트리뷰트들은 초기값을 가질 것이다. 예를 들면, 은행 계좌 입출금 트랜잭션을 수행하는 시스템을 가정해 보자. 프로그래머는 은행 이용자의 계좌 정보를 갖고 있는 객체를 하나 복사한다. 그 객체를 가지
form copy - of - g = g. clone PHP [ 편집 ] PHP 5에서는, 객체는 레퍼런스 형태로 전달된다 ( pass by reference ). 값 형태로 전달하기 위해서는, " 매직 펑션 " - - clone을 써야한다. 이러한 까닭으로 PHP 5에서는 프로토타입 패턴을 구현하기 매우 쉽다. [ 4 ] < php abstract class BookPrototype { protected $ title ; protected $ topic ; abstract function - - clone ; function getTitle { return $ this - > title ; } function setTitle ( $ titleIn ) { $ this - > title = $ titleIn ; } function getTopic { return $ this - > topic ; } } class PHPBookPrototype extends BookPrototype { function - - construct { $ this - > topic ='PHP'; } function - - clone { } } class SQLBookPrototype extends BookPrototype { function - - cons
* Prototype Class * * / public class Cookie implements Cloneable { public Object clone { try { Cookie copy = ( Cookie ) super. clone ; / / In an actual implementation of this pattern you might now change references to / / the expensive to produce parts from the copies that are held inside the prototype. return copy ; } catch ( CloneNotSupportedException e ) { e. printStackTrace ; return null ; } } } / * * Concrete Prototypes to clone * * / public class CoconutCookie extends Cookie { } / * * Client Class * * / public class CookieMachine { private Cookie cookie ; / / could have been a private Cloneable cookie ; public CookieMachine ( Cookie cookie ) { this. cookie = cookie ; } public Cookie makeCookie { return ( Cookie ) cookie. clone ; } public Object
) { echo $ line - in. " < br / > " ; } > [ 5 ] 출력은 다음과 같다. BEGIN TESTING PROTOTYPE PATTERN Book 1 topic : SQL Book 1 title : SQL For Cats Book 2 topic : PHP Book 2 title : OReilly Learning PHP 5 Book 3 topic : SQL Book 3 title : OReilly Learning SQL END TESTING PROTOTYPE PATTERN 같이 보기 [ 편집 ] 프로토타입 기반 프로그래밍 추상 팩토리 ( Abstract factory ) 패턴 빌더 ( Builder ) 패턴 각주 [ 편집 ] ↑ 가 나 다 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides ( 1994년 ). 《 Design Patterns 》. Addison - Wesley. ISBN 0 - 201 - 63361 - 2. 다음 날짜 값 확인 필요 : | date = ( 도움말 ) CS1 관리 - 여러 이름 ( 링크 ) ↑ 상속을 통해 객체를 생성 ↑ 딜리게이션을 통해 객체를 생성 ↑ object cloning ↑ Prototype Design Pattern in PHP vde
Record { public abstract Record Clone ; } / / / < summary > / / / PersonRecord is the Concrete Prototype / / / < / summary > public class PersonRecord : Record { string name ; int age ; public override Record Clone { return ( Record ) this. MemberwiseClone ; / / default shallow copy } } / / / < summary > / / / CarRecord is another Concrete Prototype / / / < / summary > public class CarRecord : Record { string carname ; Guid id ; public override Record Clone { CarRecord clone = ( Record ) this. MemberwiseClone ; / / default shallow copy clone. id = Guid. NewGuid ; / / always generate new id return clone ; } } / / / < summary > / / / RecordFactory is the client / / / < / summary > public class RecordFactory { private static Diction
초기값을 가질 것이다. 예를 들면, 은행 계좌 입출금 트랜잭션을 수행하는 시스템을 가정해 보자. 프로그래머는 은행 이용자의 계좌 정보를 갖고 있는 객체를 하나 복사한다. 그 객체를 가지고 그 객체 상에다 은행 입출금 트랜잭션을 수행한다. 그 다음 원래의 객체를 이 객체로 바꿔치기한다. 프로그래머는 이런 경우 new 대신 clone을 쓴다. 예제 [ 편집 ] C [ 편집 ] # include < iostream > # include < map > # include < string > # include < cstdint > using namespace std ; enum RECORD - TYPE - en { CAR, BIKE, PERSON } ; / * * * Record is the Prototype * / class Record { public : Record { } virtual ~ Record { } virtual Record * Clone const = 0 ; virtual void Print const = 0 ; } ; / * * * CarRecord is Concrete Prototype * / class CarRecord : public Record { private : string m - oStrCarName ; uint32 - t m - ui32ID ; public : CarR
eln ('' ) ; $ book2 = clone $ phpProto ; $ book2 - > setTitle ('OReilly Learning PHP 5') ; writeln ('Book 2 topic : '. $ book2 - > getTopic ) ; writeln ('Book 2 title : '. $ book2 - > getTitle ) ; writeln ('' ) ; $ book3 = clone $ sqlProto ; $ book3 - > setTitle ('OReilly Learning SQL') ; writeln ('Book 3 topic : '. $ book3 - > getTopic ) ; writeln ('Book 3 title : '. $ book3 - > getTitle ) ; writeln ('' ) ; writeln ('END TESTING PROTOTYPE PATTERN') ; function writeln ( $ line - in ) { echo $ line - in. " < br / > " ; } > [ 5 ] 출력은 다음과 같다. BEGIN TESTING PROTOTYPE PATTERN Book 1 to
말 ) CS1 관리 - 여러 이름 ( 링크 ) ↑ 상속을 통해 객체를 생성 ↑ 딜리게이션을 통해 객체를 생성 ↑ object cloning ↑ Prototype Design Pattern in PHP vdeh소프트웨어 디자인 패턴Gang of four 패턴생성 패턴 추상 팩토리 빌더 팩토리 메서드 프로토타입 싱글턴 구조 패턴 [UNK] 브리지 컴포지트 데코레이터 퍼사드 플라이웨이트 프록시 동작 패턴 책임 연쇄 커맨드 인터프리터 반복자 중재자 메멘토 옵서버 상태 전략 템플릿 메소드 비지터 동시성 패턴 액티브 오브젝트 Balking Binding properties en : Double - checked locking Event - based asynchronous en : Guarded suspension 조인 락 모니터 ( 동기화 ) Proactor 반응자 패턴 Read write lock 스케줄링 ( 컴퓨팅 ) 스레드 풀 en : Thread - local storage 아키텍처 패턴 프론트 컨트롤러 Interceptor 모델 - 뷰 - 컨트롤러 다층 구조 Specification 발행 - 구독 모델 en : Naked objects Service locator Active record Identity map 데이터 접근 객체 데이터 전송 객체 ADR 제어 반전 기타 패턴 Blackboard Business delegate Composite entity 의존성 주입 Interce
프로토타입 패턴(prototype pattern)은 소프트웨어 디자인 패턴 용어로, 생성할 객체들의 타입이 프로토타입인 인스턴스로부터 결정되도록 하며, 인스턴스는 새 객체를 만들기 위해 자신을 복제(clone)하게 된다. 프로토타입 패턴은, 추상 팩토리 패턴과는 반대로, 클라이언트 응용 프로그램 코드 내에서 객체 창조자(creator)를 서브클래스(subclass)하는 것을 피할 수 있게 해준다. 프로토타입 패턴은 새로운 객체는 일반적인 방법(예를 들어, new를 사용해서라든지)으로 객체를 생성(create)하는 고유의 비용이 주어진 응용 프로그램 상황에 있어서 불가피하게 매우 클 때, 이 비용을 감내하지 않을 수 있게 해준다.패턴을 구현하려면, 우선 clone 메소드를 선언하는 추상 베이스 클래스를 하나 만든다. 다형적 생성자(polymorphic constructor) 기능이 필요한 클래스가 있다면, 그것을 앞에서 만든 클래스를 상속받게 한 후, clone 메소드 내의 코드를 구현한다.