프로토타입 패턴(Prototype Pattern)
- 프로토타입 패턴은 생성패턴(Creational Pattern) 중 하나이다.
- 생성 패턴은 인스턴스를 만드는 절차를 추상화하는 패턴이다.
- 생성 패턴에 속하는 패턴들은 객체를 생성, 합성하는 방법이나 객체의 표현방법을 시스템과 분리해준다.
- 기존 인스턴스를 복제하여 새로운 인스턴스를 만드는 방법이다.
- 프로토타입 패턴은 원형이 되는 인스턴스를 사용해 새롭게 생성할 객체의 종류를 명시하여 새로운 객체가 생성될 시점에 인스턴스의 타입이 결정되도록 하는 패턴입니다
- 생성하고자 하는 객체의 클래스에서 Cloneable의 clone() 메서드를 재정의되어야 한다.
장점
- 구현 클래스에 직접 연결하지 않고 객체를 복사할 수 있습니다.(새 인스턴스를 만드는 것보다 비용적인 면에서 효율적일 수 있다.)
- 복잡한 객체를 만드는 과정을 숨길 수 있다.
- 추상적인 타입을 리턴할 수 있다.
단점
- 복제한 객체를 만드는 과정 자체가 복잡할 수 있다.(특히, 순환 참조가 있는 경우)
코드
- Mountain.class
package com.bumblebee.designpattern.creational.prototype;
import java.util.ArrayList;
import java.util.List;
public class Mountain implements Cloneable{
private List<String> mountainList;
public Mountain() {
this.mountainList = new ArrayList<>();
}
public Mountain(List<String> mountainList) {
this.mountainList = mountainList;
}
public List<String> getMountainList() {
return mountainList;
}
public void mountainListAll() {
this.mountainList.add("구룡산(306M)");
this.mountainList.add("북악산(342M)");
this.mountainList.add("아차산(295M)");
this.mountainList.add("응봉산(95M)");
this.mountainList.add("서대문 안산(295M)");
this.mountainList.add("용마산(348M)");
this.mountainList.add("인왕산(339M)");
this.mountainList.add("남산(279M)");
this.mountainList.add("불암산(509M)");
}
@Override
protected Object clone() throws CloneNotSupportedException {
//return super.clone(); 얕은 복사(shallow copy)
return new Mountain(new ArrayList<>(this.mountainList)); //깊은 복사(Deep Copy)
}
}
- MountainTest.class
- Cloneable 인터페이스를 구현하여 Mountain 클래스를 생성하였고 clone() 메소드를 통해 깊은 복사 방식으로 인스턴스를 복제 하였습니다. java에서는 기본으로 얕은 복사를 제공한다.
package com.bumblebee.designpattern.creational.prototype;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class MountainTest {
@Test
void prototypePattern() throws CloneNotSupportedException {
Mountain mountain = new Mountain();
mountain.mountainListAll();
Mountain seoulMountain = (Mountain) mountain.clone();
Mountain seoulMountain2 = (Mountain) mountain.clone();
List<String> mountainList = seoulMountain.getMountainList();
List<String> mountainList2 = seoulMountain2.getMountainList();
mountainList.add("관악산(632M)");
mountainList2.remove("북악산(342M)");
System.out.println(mountain.getMountainList());
System.out.println(mountainList);
System.out.println(mountainList2);
}
}
- 결과
정리
- DB에 접근해서 데이터를 핸들링하는 비용이 크므로 매번 DB에 접근이 필요하지 않는 데이터라면 프로토타입 패턴을 이용해서 객체를 복사해서 사용하는 방법이 유용할 것 같다.
'JAVA > Design Pettern' 카테고리의 다른 글
[Design Pattern] 데코레이터 패턴 (0) | 2022.09.17 |
---|---|
[Design Pattern] 전략 패턴 (0) | 2022.09.11 |
[Design Pattern] 커맨드 패턴 (0) | 2022.03.25 |
[Design Pattern] 책임 사슬 패턴 (0) | 2022.03.24 |
[Design Pattern] 템플릿 메서드 패턴 (0) | 2022.03.23 |