GoF 디자인 패턴 7 - [생성] 프로토타입 패턴

김정환·2024년 9월 3일
0

GoF 디자인패턴

목록 보기
7/9

프로토타입 패턴


= 클론 패턴

의도


  • 코드를 다른 클래스에 의존시키지 않고 기존 객체들을 복사할 수 있도록하는 디자인 패턴
  • 같은 값을 가진 객체를 새롭게 만드는 것보다 기존 객체를 복사하는 것이 시간적으로 더 저렴함

문제


  • 객체가 있고 그 객체의 정확한 복사본을 만들고 싶은 경우
    1. 같은 클래스의 새 객체를 생성한다.
    2. 원본 객체의 모든 필드 값들을 새 객체에 복사한다.
    • 문제
      • 객체의 필드들 중 일부가 비공개여서 외부에서 볼 수 없는 경우 복사 불가
      • 객체의 복사본을 생성하려면 객체의 클래스를 알아야 함.
        → 내 코드가 해당 클래스에 의존하게 됨.
      • 메서드의 매개변수가 일부 인터페이스를 따르는 모든 객체를 수락할 때,
        그 객체가 따르는 인터페이스만 알고 그 객체의 구상 클래스를 알지 못할 수도 있음.
        = 메서드가 매개변수로 어떤 인터페이스를 구현한 모든 객체를 인자로 받을 때,
        이 객체가 구현한 인터페이스만 알고 그 객체의 Concrete Class를 알지 못하는 경우

해결책


  • 프로토타입 패턴은 실제로 복제되는 객체들에 복제 프로세스를 위임한다.
    • 패턴은 복제를 지원하는 모든 객체에 대한 공통 인터페이스를 선언
    • 이 인터페이스를 사용해 코드를 객체의 클래스에 결합하지 않고 해당 객체를 복제 가능
    • 일반적으로 이런 인터페이스에는 단일 clone 메서드만 포함
  • clone 메서드의 구현은 모든 클래스에서 유사
    • clone 메서드는 현재 클래스의 객체를 만들고 이전 객체의 모든 필드 값을 새 객체로 전달
    • 대부분의 언어는 객체들이 같은 클래스에 속한 다른 객체의 비공개 필드들에 접근할 수 있도록 허용하므로 비공개 필드들을 복사하는 것도 가능
  • 복제를 지원하는 객체 = 프로토타입

프로토타입의 작동

  1. 다양한 방식으로 설정되어 있는 객체들 생성
  2. 설정한 것들 중 비슷한 객체가 필요한 경우 새 객체를 만드는 대신 프로토타입을 복제

복사의 종류

  • 얕은 복사
    • 객체를 공유하는 방식으로 복사
    • 공유 : 객체 복사 시, 새로운 자원을 할당받지 않고 객체를 복사
    • 실제 변수를 복사하는 것이 아닌 포인터가 원본을 가리키게 하는 것
...
// 얕은 복사 = 객체 공유
Class obj_1 = new Class();
Class obj_2 = obj_1;
...
  • 깊은 복사
    • 물리적으로 다른 메모리 영역을 할당받아 변수를 복사

실제상황 적용


  • 실제 산업에서 프로토타입은 제품의 대량 생산을 시작하기 전 다양한 테스트 수행에 사용됨.
    하지만 프로그래밍의 프로토타입은 실제 생산 과정에 참여하지 않고 수동적인 역할을 수행.
  • 실제 산업 프로토타입들은 실제로 자신을 복제하지 않음.
    때문에 프로토타입 패턴에 더 가까운 예시는 세포의 유사분열 과정임
    = 유사 분열 후에는 한 쌍의 같은 세포가 형성됨
  • 원본 세포는 프로토타입 역할을 하며 복사본을 만드는 능동적인 역할을 수행.

구조


profile
만성피로 개발자

0개의 댓글