Featured image of post 14. 다양한 패턴 빠르게 알아보기 - 프로토타입 패턴

14. 다양한 패턴 빠르게 알아보기 - 프로토타입 패턴

헤드 퍼스트 디자인 패턴

프로토타입(Prototype) 패턴

어떤 클래스의 인스턴스를 만들 때 자원과 시간이 많이 들거나 복잡하다면 프로토타입 패턴을 사용한다.

프로토타입 패턴은 객체를 생성하는 비용이 큰 경우, 기존 객체를 복사하여 새로운 객체를 생성하는 디자인 패턴 중 하나이다.

이는 객체를 생성하는 비용을 줄이고, 복잡한 초기화 과정을 반복하지 않고도 객체를 생성할 수 있게한다.

특징

시스템에서 복잡한 클래스 계층구조에 파묻혀 있는 다양한 형식의 객체 인스턴스를 새로 만들어야 할 때 유용하게 써먹을 수 있다.

  • 복사를 통한 객체 생성
    • 기존 객체를 복사하여 새로운 객체를 생성한다.
  • 생성 비용 감소
    • 비용이 큰 객체 생성을 피하고, 복사를 통해 새로운 객체를 빠르게 생성한다.

구조

프로토타입 패턴 구조

  • Prototype(프로토타입)
    • 복사될 객체에 대한 인터페이스를 정의한다.
  • ConcretePrototype(구체적인 프로토타입)
    • Prototype 인터페이스를 구현하고, 자신을 복사하여 새로운 객체를 생성하는 메서드를 구현한다.
  • Client
    • 프로토타입 객체를 복사하여 새로운 객체를 생성한다.

예시

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// Prototype
public interface Prototype {
    Prototype clone();
}

// ConcretePrototype
public class ConcretePrototype implements Prototype {
    private String data;

    public ConcretePrototype(String data) {
        this.data = data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getData() {
        return data;
    }

    @Override
    public Prototype clone() {
        return new ConcretePrototype(this.data);
    }
}

// Client
public class Client {
    public static void main(String[] args) {
        ConcretePrototype prototype = new ConcretePrototype("Original Data");

        // 복사하여 새로운 객체 생성
        ConcretePrototype clonedObject = (ConcretePrototype) prototype.clone();

        // 원본과 복제본의 데이터 확인
        System.out.println("Original Data: " + prototype.getData());
        System.out.println("Cloned Data: " + clonedObject.getData());

        // 복제본의 데이터 변경
        clonedObject.setData("Modified Data");

        // 원본과 복제본의 데이터 확인
        System.out.println("Original Data: " + prototype.getData());
        System.out.println("Cloned Data: " + clonedObject.getData());
    }
}

장단점

장점

  • 생성 비용 감소
    • 비용이 큰 객체 생성을 피하고, 복사를 통해 빠르게 새로운 객체를 생성할 수 있다.
  • 유연성 증가
    • 객체의 생성 및 초기화 과정을 반복하지 않고, 복사를 통해 새로운 객체를 생성할 수 있어 유연성이 증가한다.
  • 결합도 감소
    • 클라이언트가 새로운 인스턴스를 만드는 과정을 몰라도 된다.
    • 클라이언트는 구체적인 형식을 몰라도 객체를 생성할 수 있다.

단점

  • 때로는 객체의 복사본을 만드는 일이 매우 복잡할 수도 있다.
    • 깊은 복사 어려움
      • 객체에 참조 타입 멤버 변수가 있는 경우, 이를 얕은 복사로 처리할 경우 문제가 발생할 수 있다.
    • clone 메서드의 구현 어려움
      • clone 메서드를 구현하는 것이 쉽지 않을 수 있으며, 실수할 여지가 많다.