Programing/Design Patterns
Prototype Pattern 프로토타입 패턴 GoF 디자인패턴
리커니
2023. 7. 11. 17:32
반응형
GoF 디자인 패턴 중 생성패턴의 하나인 Prototype 패턴에 대해 알아보도록 하겠습니다.
특징
Prototype Pattern 은 자주 사용하는 객체를 생성해 두고 이를 복사하여 사용하는 패턴을 말합니다.
Singleton 패턴과 달리 매번 새로운 객체가 생성이 됩니다.
@Scope("prototype") 설정으로 Prototype Pattern 으로 동작하게 할 수 있습니다.
참조 변수 필드의 경우 얕은 복사로 처리 되기 때문에 java.lang.Clonable interface를 implements 받아
깊은 복사로 처리되도록 clone method를 구현해야 합니다.
샘플코드
import java.util.ArrayList;
import java.util.List;
import java.util.StringJoiner;
public class Operators implements Cloneable {
private List<String> operators;
public Operators() {
this.operators = new ArrayList<>();
}
public Operators(List<String> operators) {
this.operators = operators;
}
public List<String> getOperators() {
return this.operators;
}
public void init() {
this.operators.add("geonlee");
this.operators.add("hyunmo");
this.operators.add("kyungsic");
}
@Override
public Object clone() throws CloneNotSupportedException {
List<String> temp = new ArrayList<>();
for (String o : this.operators) {
temp.add(o);
}
return new Operators(temp);
}
@Override
public String toString() {
StringJoiner sj = new StringJoiner(", ", "[", "]");
for(String o : this.operators){
sj.add(o);
}
return sj.toString();
}
}
import java.util.List;
public class PrototypePattern {
public static void main(String args[]) throws CloneNotSupportedException {
Operators operators = new Operators();
operators.init();
System.out.println("============origin============");
System.out.println(operators.toString());
Operators clone1 = (Operators) operators.clone();
Operators clone2 = (Operators) operators.clone();
List<String> cloneList1 = clone1.getOperators();
cloneList1.add("jisu");
cloneList1.add("bitna");
cloneList1.add("byungmin");
System.out.println("============clone1============");
System.out.println(cloneList1.toString());
List<String> cloneList2 = clone2.getOperators();
cloneList2.add("yoonsook");
cloneList2.add("mijin");
cloneList2.add("changhee");
System.out.println("============clone2============");
System.out.println(cloneList2.toString());
}
}
실행결과
============origin============
[geonlee, hyunmo, kyungsic]
false
============clone1============
[geonlee, hyunmo, kyungsic, jisu, bitna, byungmin]
============clone2============
[geonlee, hyunmo, kyungsic, yoonsook, mijin, changhee]
실행 결과를 보시는 것처럼 origin은 유지되며, clone 메소드 호출 시 다른 객체(복사된 객체)로 생성되는 것을 확인하실 수 있습니다.
위의 샘플코드는 초기세팅비용이 많이 들지 않는 간단한 코드이지만,
초기 세팅이 복잡하고 동일한 객체를 여러번 생성해야 되는 경우 Prototype Pattern으로 생성하면 객체 생성 비용과 시간을 절약 할 수 있습니다.
반응형