-
Prototype Pattern(프로토타입 패턴)STUDY/디자인패턴 2024. 11. 26. 22:45
프로토타입 패턴이란?
코드를 그들의 클래스들에 의존시키지 않고 기존 객체들을 복사할 수 있도록 하는 생성 디자인 패턴
문제
어떤 객체가 있고 그 객체의 정확한 복사본을 만들고 싶은 경우, 먼저 같은 클래스의 새 객체를 생성하고 원본 객체의 모든 필드들을 새 객체에 복사해야 한다. 하지만 여기에 문제가 두 가지 존재한다.
1. 객체의 필드들 중 일부가 비공개여서 객체 자체를 외부에서 볼 수 없을 수 있으므로 모든 객체를 복사하지 못한다.
2. 객체의 복제본을 생성하려면 객체의 클래스를 알아야 하므로, 코드가 해당 클래스에 의존하게 된다.
해결책
프로토타입 패턴은 실제로 복제되는 객체들에 복제 프로세스를 위임한다. 패턴은 복제를 지원하는 모든 객체에 대한 공통 인터페이스를 선언하다. 이 인터페이스를 사용하면 코드를 객체의 클래스에 결합하지 않고도 해당 객체를 복제할 수 있고, 일반적으로 이러한 인터페이스에는 단일 clone 메서드만 포함된다.
clone 메서드는 현재 클래스의 객체를 만든 후 이전 객체의 모든 필드 값을 새 객체로 전달한다. 대부분의 프로그래밍 언어는 객체들이 같은 클래스에 속한 다른 객체의 비공개 필드들에 접근할 수 있도록 하므로 비공개 필드들을 복사하는 것도 가능하다.
구조
- 프로토타입 : 복제 메서드들을 선언하는 인터페이스로, 이 메서드들의 대부분은 단일 clone 메서드이다.
- 구상 프로토타입 : 복제 메서드를 구현한 클래스로, 원본 객체의 데이터를 복제본에 복사하는 것 외에도 이 메서드는 복제 프로세스와 관련된 일부 예외적인 경우들도 처리할 수 있다.
- 클라이언트 : 프로트타입 인터페이스를 따르는 모든 객체의 복사본을 생성할 수 있다.
예시
public abstract class Shape { private int x; private int y; private String color; public Shape() { } public Shape(Shape shape) { this.x = shape.x; this.y = shape.y; this.color = shape.color; } public abstract Shape clone(); }
public class Rectangle extends Shape { private int width; private int height; public Rectangle() { } public Rectangle(Rectangle rectangle) { super(rectangle); this.width = rectangle.width; this.height = rectangle.height; } @Override public Shape clone() { return new Rectangle(this); } } public class Circle extends Shape { private int radius; public Circle() {} public Circle(Circle circle) { super(circle); this.radius = circle.radius; } @Override public Shape clone() { return new Circle(this); } }
public class Client { public static void main(String[] args) { List<Shape> shapes = new ArrayList<>(); Circle circle = new Circle(); circle.setX(10); circle.setY(10); circle.setRadius(20); shapes.add(circle); Rectangle rectangle = new Rectangle(); rectangle.setWidth(10); rectangle.setHeight(20); shapes.add(rectangle); List<Shape> cloneShapes = new ArrayList<>(); for (Shape shape : shapes) { cloneShapes.add(shape.clone()); } cloneShapes.forEach(System.out::println); } } # 결과 Circle{radius=20} Rectangle{width=10, height=20}
적용
- 복사해야 하는 객체들의 구상 클래스들에 코드가 의존하면 안되는 경우
- 각자의 객체를 초기화하는 방식만 다른 자식 클래스들의 수를 줄이고 싶은 경우
장단점
장점
- 객체들을 그 구상 클래스들에 결합하지 않고 복제할 수 있다,
- 반복되는 초기화 코드를 제거한 후 그 대신 미리 만들어진 프로토타입들을 복제하는 방법을 사용할 수 있다.
- 복잡한 객체들을 더 쉽게 생성할 수 있다.
- 복잡한 객체들에 대한 사전 설정들을 처리할 때 상속 대신 사용할 수 있다.
단점
- 순환 참조가 있는 복잡한 객체들을 복제하는 것은 매우 까다로울 수 있다.
'STUDY > 디자인패턴' 카테고리의 다른 글
Adapter Pattern(어댑터 패턴) (0) 2024.12.08 Singleton Pattern(싱글턴 패턴) (0) 2024.11.26 Builder Pattern(빌더 패턴) (0) 2024.11.12 Abstract Factory Pattern(추상 팩토리 패턴) (1) 2024.11.12 Factory Method Pattern(팩토리 메서드 패턴) (0) 2024.10.29