[디자인패턴] Prototype

Judy·2022년 10월 26일
0

디자인패턴

목록 보기
2/11
post-thumbnail

Prototype

Creational Patterns

클래스 코드에 종속시키지 않고 기존 객체를 복사할 수 있는 생성 패턴


Problem - 왜 필요할까

이미 존재하는 객체의 복사본을 만들고 싶다면?

  1. 동일한 클래스의 새 객체를 생성
  2. 원본 객체의 모든 필드를 새 객체에 복사

➡️ Good👍 인 줄 알았지만.. 🙅‍♂️ ❌

개체의 일부 필드가 비공개로 외부에서 볼 수 없을 경우 복사가 불가능합니다.
또한 복제본을 생성하려면 해당 객체의 클래스를 알아야 하므로 코드가 해당 클래스의 종속됩니다.

➡️ 외부에서 객체를 복사하는 것은 어려운 일


Solution - 어떻게 사용할까

Prototype 패턴은 복제되는 객체에 복제 프로세스를 위임합니다.

복제를 지원하는 모든 객체에 대한 공통 인터페이스를 선언합니다. 인터페이스를 사용하면 코드를 해당 객체의 클래스에 연결하지 않고도 객체를 복사할 수 있습니다. 일반적으로 이런 인터페이스에는 clone 메서드만 포함됩니다.

clone 메서드의 역할

  • 현재 클래스의 객체를 만들기
  • 이전 객체의 모든 필드 값을 새 객체로 전달

대부분의 언어에서 동일한 클래스에 속한 다른 객체의 private 필드에 접근할 수 있으므로 모든 필드를 복사할 수 있습니다.

이렇게 복제를 지원하는 객체를 Prototype이라고 합니다. 만약 객체가 수많은 필드와 기능을 가지고 있을 때 이를 복제하는 것이 subclassing의 대안이 될 수 있습니다.(❓)

이미 복잡한 객체를 만든 후 설정과 비슷한 객체가 필요하다면 처음부터 새 객체를 생성하는 대신 프로토타입을 복제하면 됩니다.


Real-World Analogy - 비유로 이해하기

실생활의 프로토타입

  • 원래의 형태 또는 전형적인 예시, 기초 또는 표준
  • 정보시스템의 미완성 버전 또는 중요한 기능들이 포함되어 있는 시스템의 초기모델
  • 제품 대량 생산 전 다양한 테스트를 위해 사용

Prototype 패턴과 다른 점

➡️ 프로토타입이 실제 생산에는 참여하지 않고 수동적인 역할을 함

세포 분열 비유

Prototype 패턴과 더 가까운 비유는 세포의 분열 과정입니다.
세포 분열 후에는 동일한 세포가 형성되는데 본래의 세포는 프로토타입 역할을 하며 새로운 세포를 만드는 데에 적극적인 역할을 합니다.

Structure - 구조

  1. Prototype 인터페이스 - clone()
  2. ConcretePrototype - 복제 메서드 구현
  3. Client - 프로토타입 인터페이스를 따르는 모든 객체의 복사본 생성 가능

Applicability - 언제 사용할까

  • 코드가 복사할 객체의 의존하지 않아야 하는 경우
  • 객체를 초기화하는 방식만 다른 하위 클래스의 수를 줄이고 싶을 때

구현 방법

  1. 프로토타입 인터페이스를 만들고 clone 메서드를 선언
  2. 프로토타입 클래스는 해당 객체를 인수로 받는 대체 생성자를 정의
    • 생성자는 모든 필드의 값을 새로 생성된 객체로 복사
  3. 새로운 객체를 생성하는 복제 메서드 구현

장점과 단점

장점

✅ 구체적인 클래스와 연결하지 않고 객체를 복제
✅ 빌드된 프로토타입을 복제하기 위해 반복되는 초기화 코드 제거
✅ 복잡한 객체를 쉽게 생성
✅ 상속을 대신해 복잡한 객체를 미리 구성 가능

단점

❎ 순환 참조가 있는 복잡한 객체의 경우 복제하기 까다로울 수 있음


참고 자료

Prototype

profile
iOS Developer

0개의 댓글