theory/디자인패턴

GoF의 디자인 패턴. 생성패턴 4. 프로토타입

아르르르를를르 2021. 9. 5. 22:11

- 지난 글에 이어 생성패턴을 다뤄본다.

추상 팩토리 (Abstract Factory)

빌더 (Builder)

팩토리 메서드 (Factory Methods)

프로토타입 (Prototype)

싱글턴 (Singleton)

 


프로토타입 (Prototype)

- 의도

생성할 객체의 원형(prototpye)을 만들고, 이렇게 만든 견본을 복사하여 새로운 객체 생성

 

- 동기

원형이 되는 클래스를 생성하고, 해당 클래스의 객체를 복제하여 새로운 객체를 만들어나가는 패턴이다. 클래스를 동일하게 유지하면서 내부의 값이나 구조를 바꿔가며 새로운 객체를 만들 수 있기 때문에 클래스의 개수를 줄일 수 있다.

 

- 활용성

제품의 생성, 복합, 표현 방법에 독립적인 제품을 만들고자 할 때 쓰인다.

  • 인스턴스화할 클래스를 런타임에 지정할 때 (동적로딩)
  • 제품 클래스 계통과 병렬적으로 만드는 팩토리 클래스를 피할 때
  • 서로 다른 상태 조합이 필요한 경우 (원형으로 조합을 초기화 해둔 뒤, 나중에 이를 복제해서 매번 필요한 상태 조합의 값들을 수동적으로 초기화)

 

- 구조

 

- 참여자

  • Prototype: 자신을 복제하는 필요한 인터페이스를 정의
  • Concrete Prototype: 자신을 복제하는 연산을 구현
  • Client: 원형에 자기 자신의 복제를 요청하여 새로운 객체를 생성

 

- 결과

  • 런타임에 새로운 제품을 추가/삭제
  • 구조/값들을 다양화함으로써 새로운 객체 명세
  • 서브클래스의 수 감소
  • 동적으로 클래스에 따라 응용프로그램으로 설정 가능

원형 패턴 사용시 신경써야할 포인트는 원형의 서브클래스가 Clone() 연산을 구현해야 한다.

 

- 구현

  1. 원형 관리자 사용
  2. Clone() 연산 구현
  3. Clone() 초기화 (Initialize() 등)

 

- 예제

Car.java (Prototype)

public abstract class Car implements Cloneable {

    public abstract void printInfo();

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

 

Tesla.java (ConcretePrototype)

public class Tesla extends Car {

    @Override
    public void printInfo() {
        System.out.println("Tesla!!!");
    }
}

 

Tucson.java (ConcretePrototype)

public class Tucson extends Car {

    @Override
    public void printInfo() {
        System.out.println("Tucson!!!");
    }
}

 

Main.java (Client)

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
        Tesla tesla = new Tesla();
        
        Tesla tesla1 = (Tesla) tesla.clone();
        tesla1.printInfo();
        Tesla tesla2 = (Tesla) tesla.clone();
        tesla2.printInfo();


        Tucson tucson = new Tucson();
        
        Tucson tucson1 = (Tucson) tucson.clone();
        tucson1.printInfo();
        Tucson tucson2 = (Tucson) tucson.clone();
        tucson2.printInfo();
    }
}


// 실행결과
//
// Tesla!!!
// Tesla!!!
// Tucson!!!
// Tucson!!!

 

 

- 참고 문헌

  • GoF의 디자인 패턴(개정판) / 에릭 감마, 리처드 헬름, 랄프 존슨, 존 블라시디스 공저 / 김정아 역 / 프로텍미디어 / 발행 2015년 03월 26일