[디자인패턴] 원형(프로토타입) 패턴(prototype pattern)

2016. 11. 15. 20:21프로그래밍/디자인패턴

    목차

원형(프로토타입) 패턴(prototype pattern)


객체에 의해 생성될 객체의 타입이 결정되는 생산 디자인 패턴

미리 만들어진 개체를 복사하여 개체를 생성하는 패턴


 
설명


객체 생성과 관련된 패턴들은 서로 영역이 겹치는 면이 있다

프로토타입 패턴과 추상 팩토리 패턴  어느 하나가 적용될  있는 경우가 있다추상 팩토리 패턴이 프로토타입들의 집합을 갖고있다가클론(clone)  프로덕트(product) 객체를 반환할 수도 있다.

추상 팩토리 패턴빌더 패턴프로토타입 패턴은  구현에 있어서 싱글턴 패턴 활용할  있다.

다시 말해 추상 팩토리 클래스는 종종 팩토리 메소드과 함께 구현하거나프로토타입을 이용해서 구현되기도 한다.

보통 설계는 처음에는 팩토리 메소드로 출발한다다음에 설계자의 재량에 따라 추상 팩토리 패턴빌더 패턴프로토타입 패턴으로 바뀔  있다.

프로토타입은 서브클래싱 필요로 하지 않는다하지만 "초기화동작을 필요로 한다팩토리 메서드 패턴 서브클래싱을 필요로 하나, "초기화동작은 필요로 하지 않는다.

설계자는 컴포지트 패턴이나 데코레이터 패턴 매우 많이 사용한 무거운 설계를 프로토타입을 사용하여  좋게 만들  있다.

원칙은 "런타임"  다른 "객체" 생성한다는 것이다다시 말해  시점에 가서 클로닝(cloning) 하는 객체의 "실제 복사본" 만들어지는 것이다. "실제 복사본"이라는 말은 새로 생성되는 객체가 클로닝(cloning) 당하는 객체의 애트리뷰트 똑같은 애트리뷰트를 가질 것이라는 말이다반면에, "new" 이용해 객체를 생성했다면새로이 생성된 객체의 애트리뷰트들은 초기값을 가질 것이다.

[펌] https://ko.wikipedia.org/wiki/프로토타입_패턴


일반화 관계로 표현을 할 때 파생클래스의 개수가 과도히 많아지고 각 클래스의 메서드가 수행하는 알고리즘에서 차이가 없고 생성 시에 개체의 속성에 차이만 있다면 원형 패턴을 사용하는 것이 효과적이다.


  작성형식


 


  설명


프로토타입 패턴의 장점

  • 객체를 생성해 주기 위한 별도의 객체 생성 클래스가 불필요하다.
  • 객체의 각 부분을 조합해서 생성되는 형태에도 적용 가능하다.


프로토타입 패턴의 단점

  • 생성될 객체들의 자료형인 클래스들이 모두 clone() 메서드를 구현해야 한다.


프로토타입 활용 용도

  • run-time에 새로운 제품을 추가하고 삭제할 수 있다.

패턴을 이용하면 사용자에게 원형으로 생성되는 인스턴스를 등록하는 것만으로도 시스템에 새로운 제품 클래스를 추가할 수 있게 됩니다. run-time에 새로운 프로토타입을 넣고 빼기가 쉽다는 점에서 다른 생성 패턴에 비해 유연성을 지니고 있습니다.

  • 을 다양화 함으로써 새로운 객체를 명세할 수 있다.

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

  • 구조를 다양화 함으로써 새로운 객체를 명세할 수 있다.

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

  • 서브클래스의 수를 줄일수 있다.

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

  • 동적으로 클래스에 따라 응용프로그램을 설정할 수 있다.

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



  참조


http://donxu.tistory.com/entry/Prototype-pattern-프로토타입-패턴

https://ko.wikipedia.org/wiki/프로토타입_패턴

https://blog.seotory.com/post/2015/09/java-prototype-pattern