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으로 생성하면 객체 생성 비용과 시간을 절약 할 수 있습니다.

반응형