Updated:

1. 개요

생성할 객체의 원형을 만들고, 원형을 복사해서 새로운 객체를 생성하는 패턴

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

2. 생성 패턴(Creational Pattern)

2-1. 생성 패턴이란?

생성 패턴이란 인스턴스를 만드는 절차를 추상화하는 패턴으로, 객체를 생성, 합성하는 방법이나 객체의 표현 방법과 시스템을 분리해 준다. 생성 패턴은 아래 두 가지 특징으로 인해 무엇이, 어떻게, 언제 생성되는지 결정하는데 유연성을 확보할 수 있다.

  • 시스템이 어떤 구체 클래스를 사용하는지에 대한 정보를 캡슐화 한다.

  • 인스턴스들이 어떻게 만들고, 결합하는지에 대한 부분을 완전히 가려준다.

2-2. 생성 패턴 종류

3. 구성

[출처 : GoF의 디자인 패턴]

  • Prototype : 복제를 위해 필요한 인터페이스 정의

  • ConcretePrototype : 인터페이스 구현 및 복제 연산 재정의

  • Client : 복제를 요청하여 새로운 객체 생성

4. 예제 코드

로봇을 제작하는 코드를 구현한다고 가정해보자. 로봇 제작에 필요한 공통적인 요소들로 추상 클래스(Ptototype)를 만들고, 해당 클래스를 상속하여 추가적으로 필요한 기능들을 구현한 클래스(ConcretePrototype)를 만든다. 복제를 통한 객체 생성을 위해 각각의 클래스는 Clone() 연산을 구현해야 한다.

4-1. Prototype

[Robot.java]

1
2
3
4
5
6
7
8
9
10
public abstract class Robot implements Cloneable {

    public abstract void printInfo();

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

4-2. ConcretePrototype

[MazingerZ.java]

1
2
3
4
5
6
7
public class MazingerZ extends Robot {

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

[TaekwonV.java]

1
2
3
4
5
6
7
public class TaekwonV extends Robot {

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

5. 테스트

[Clinet.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Client {

    public static void main(String[] args) throws CloneNotSupportedException {
        MazingerZ mazingerZ = new MazingerZ();
        MazingerZ mazingerZ1 = (MazingerZ) mazingerZ.clone();
        mazingerZ1.printInfo();
        MazingerZ mazingerZ2 = (MazingerZ) mazingerZ.clone();
        mazingerZ2.printInfo();

        TaekwonV taekwonV = new TaekwonV();
        TaekwonV taekwonV1 = (TaekwonV) taekwonV.clone();
        taekwonV1.printInfo();
        TaekwonV taekwonV2 = (TaekwonV) taekwonV.clone();
        taekwonV2.printInfo();
    }
}

[실행 결과]

6. 특징

  • 런타임 시점에 새로운 유형의 객체 추가 가능 : 원형으로 정의한 클래스를 복제하여 새로운 유형의 객체 추가 가능

  • 서브 클래스 수 줄일 수 있음 : 새로운 클래스의 생성 없이 기존의 객체를 복제하여 새로운 객체 생성 가능

Updated:

Leave a comment