S E P H ' S
[생성 패턴] 프로토타입(Prototype) 패턴 본문
프로토타입 패턴은 객체를 생성하는 데 시간과 노력이 많이 들고, 이미 유사한 객체가 존재하는 경우에 사용된다. 그리고 java의 clone()을 이용하기 때문에 생성하고자 하는 객체에 clone에 대한 Override를 요구한다. 이때 주의할 점은 반드시 생성하고자 하는 객체의 클래스에서 clone()이 정의되어야 한다는 것이다.
예를 들어 DB로부터 데이터를 가져오는 객체가 존재한다고 가정해보자.
만약 DB로부터 가져온 데이터를 우리의 프로그램에서 수차례 수정을 해야하는 요구사항이 있는 경우, 매번 new 라는 키워드를 통해 객체를 생성하여 DB로부터 항상 모든 데이터를 가져오는 것은 좋은 아이디어가 아니다. DB로 접근해서 데이터를 가져오는 행위는 비용이 크기 때문이다. 따라서 한 번 DB에 접근하여 데이터를 가져온 객체를 필요에 따라 새로운 객체에 복사하여 데이터 수정 작업을 하는 것이 더 좋은 방법이다.
이때, 객체의 복사를 얕은 복사(shallow copy)로 할지 깊은 복사(deep copy)로 할 지에 대해서는 선택적으로 행하면 된다.
public class Employees implements Cloneable {
private List<String> empList;
public Employees() {
empList = new ArrayList<String>();
}
public Employees(List<String> list) {
this.empList = list;
}
public void loadData() {
empList.add("seph");
empList.add("jiin");
empList.add("hayoung");
empList.add("hyo");
}
public List<String> getEmpList() {
return empList;
}
@Override
public Object clone() throws CloneNotSupportedException {
List<String> temp = new ArrayList<String>();
for (String s: this.empList) {
temp.add(s);
}
return new Employees(temp);
}
}
clone() 메소드를 재정의하기 위해 Cloneable 인터페이스를 구현하였다. 여기서 사용되는 clone()은 empList에 대한 깊은 복사를 실시한다.
PrototypePatternTest
public class PrototypePatternTest {
public static void main(String[] args) throws CloneNotSupportedException {
Employees emps = new Employees();
emps.loadData();
Employees empsNew = (Employees) emps.clone();
Employees empsNew1 = (Employees) emps.clone();
List<String> list = empsNew.getEmpList();
list.add("ho");
List<String> list1 = empsNew1.getEmpList();
list1.remove("seph");
System.out.println("emps List: " + emps.getEmpList());
System.out.println("empsNew List: " + list);
System.out.println("empsNew1 List: " + list1);
}
}
만약 Employees 클래스에서 clone()을 제공하지 않았다면, DB로부터 매번 employee 리스트를 직접 가져와야 했을 것이고, 그로 인한 상당한 비용이 발생했을 것이다.
하지만 프로토타입을 사용한다면 DB 접근은 최초에 1번만 수행하고 가져온 데이터를 복사하여 사용한다면 이를 해결할 수 있다. 객체를 복사하는 것이 네트워크 접근이나 DB 접근보다 훨씬 비용이 적다.
'Programing & Coding > Design Pattern' 카테고리의 다른 글
[행동 패턴] 책임 연쇄(Chain of Responsibility) 패턴 (0) | 2023.03.19 |
---|---|
[구조 패턴] 컴포지트(Composite) 패턴 (0) | 2023.03.19 |
[생성 패턴] 빌더(Builder) 패턴 (0) | 2023.03.05 |
[생성 패턴] 추상 팩토리 (Abstract Factory) 패턴 (0) | 2023.03.05 |
[생성 패턴] 팩토리(Factory) 패턴 (0) | 2023.03.04 |