프로토타입 패턴은 객체의 복사본을 쉽게 생성할 수 있도록 하는 패턴이다.
이 패턴은 기존 객체를 복제하여 새로운 객체를 만들기 때문에, 객체를 직접 생성하는 비용이 큰 경우 유용하게 사용할 수 있다.
프로토타입 패턴은 객체의 필드 값을 복제하여 새로운 객체를 만든다.
이때, 객체에 private 필드가 있더라도 해당 필드를 포함한 전체 상태를 복사할 수 있다.
이 복제는 직접적인 new
연산자를 통해 객체를 생성하는 것과는 다르다.
새 객체의 모든 필드를 원본 객체에서 복사해 오기 때문에, 생성 시마다 고정된 초기 상태를 가질 수 있다.
그러나 일부 필드가 private로 선언되어 있거나, 다른 객체와의 강한 의존 관계가 있는 경우 복제가 제한될 수 있다.
이러한 문제를 해결하기 위해 공통 인터페이스를 도입한다.
이 인터페이스를 통해 객체가 복제될 수 있도록 하여 객체 간 결합을 느슨하게 만들어준다.
즉, 원본 객체를 인터페이스로 복제하여 인터페이스의 메서드를 통해 필드 접근 문제를 해결하는 방식이다.
시스템 내에서 동일한 형태의 객체가 반복적으로 사용되어야 할 경우, 또는 생성 비용이 높은 객체를 효율적으로 관리하고자 할 때 프로토타입 패턴은 매우 유용하다.
이 패턴을 사용하면 기본 상태가 동일한 객체를 여러 개 생성할 수 있으면서, 각 객체가 서로 독립적으로 유지된다.
프로토타입 패턴은 다음과 같은 구성 요소로 이루어진다:
Client
└─ Prototype
├─ ConcretePrototypeA
├─ ConcretePrototypeB
이번 예시는 서적(Book)을 복제할 수 있는 도서 관리 프로그램을 예로 들어 보겠다.
각 서적에는 고유한 정보가 있으며, 서적을 복제함으로써 같은 형태의 다른 서적을 여러 개 생성할 수 있다.
// 프로토타입 인터페이스
interface Prototype {
Prototype clone();
}
// 구체적인 프로토타입: 서적
class Book implements Prototype {
private String title;
private String author;
public Book(String title, String author) {
this.title = title;
this.author = author;
}
// 복제 메서드
@Override
public Prototype clone() {
return new Book(this.title, this.author);
}
public void displayInfo() {
System.out.println("제목: " + title + ", 저자: " + author);
}
}
// 클라이언트 코드
public class Main {
public static void main(String[] args) {
Book originalBook = new Book("디자인 패턴", "에릭 감마");
originalBook.displayInfo();
// 서적 복제
Book clonedBook = (Book) originalBook.clone();
clonedBook.displayInfo();
}
}
Prototype
인터페이스는 clone()
메서드를 정의하여 객체 복제 기능을 제공한다.Book
클래스는 Prototype
인터페이스를 구현하며, clone()
메서드를 통해 자신을 복제한다. 복제된 객체는 title
과 author
필드를 그대로 복사한다.Main
클래스에서는 원본 서적을 생성한 후 이를 복제하여 동일한 정보를 가진 새로운 서적 객체를 만든다.제목: 디자인 패턴, 저자: 에릭 감마
제목: 디자인 패턴, 저자: 에릭 감마
clone()
메서드를 구현하기 까다롭다.프로토타입 패턴(Prototype Pattern)은 시스템 내에서 객체의 복제를 통해 효율성을 극대화하고자 할 때 유용한 패턴이다.
특히 생성 비용이 큰 객체나 상태가 복잡한 객체의 복제를 손쉽게 관리할 수 있어, 다양한 상황에서 활용된다.
아래 글에서 다른 디자인 패턴들을 확인할 수 있다.
디자인 패턴 모음