공부/디자인 패턴

[공부/디자인 패턴] Prototype 패턴

오잎 클로버 2022. 3. 20. 08:20
728x90

Prototype Pattern

객체를 생성하는 데 비용(시간과 자원)이 많이 사용되고, 비슷한 객체가 이미 있는 경우에 사용되는 패턴입니다.

Original 객체를 새로운 객체에 복사하여 우리의 필요에 따라 수정하는 메커니즘을 제공합니다.

이 패턴은 복사를 위해 #clone() 을 사용합니다.

#clone()에서는 옅은 복사 혹은 깊은 복사, 이 둘을 개발자가 정의가능합니다.

Prototype Pattern Structure

public class Minion implements Cloneable {

    private String name;
    private String job;

    public Minion(String name) {
        this.name = name;
    }

    public Minion(String name, String job) {
        this.name = name;
        this.job = job;
    }

    public void loadWork() {
        System.out.println(name + ": " + job);
    }

    public void setJob(String job) {
        this.job = job;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return new Minion(name, job);
    }
}

 

"미니언"들은 클론한 것처럼 굉장히 많기에 클래스명은 "미니언"이라고 작명하였습니다.

미니언에게는 `이름`과 `직업`이 있고, 언제든 직업이 바뀌기에 #setJob()으로 다시 정할 수 있도록 하였습니다.

(이름이 다시 바뀔 수 있는 이유는 개명을 할 수도 있기에)

public class MinionLab {

    public static void main(String[] args) throws CloneNotSupportedException {
        Minion minion = new Minion("stuart", "제련");
        minion.loadWork();

        Minion minionNew = (Minion) minion.clone();
        Minion minionNew1 = (Minion) minion.clone();
        
        minionNew.setName("bob");
        minionNew.setJob("악기 연주");
        minionNew.loadWork();

        minionNew1.setJob("요리");
        minionNew1.loadWork();
    }

}

최초로 "stuart"이라는 이름을 가진 미니언을 생성합니다.

미니언 中 스튜어트

"stuart"는 제련을 주로 합니다.

그리곤 "stuart"라는 미니언을 복제하여, 각기 다른 직업을 정의해줍니다.

하나는 "bob"이라는 이름으로 바꾸고, 직업 역시 악기 연주로 이직하였습니다.

나머지는 "stuart"라는 이름이 마음에 들었는 지, 그대로 내버려두었고, 제련과는 거리가 멀다고 느꼈는 지

요리로 직업을 바꿨습니다.

 

 

이상입니다.

'공부 > 디자인 패턴' 카테고리의 다른 글

[공부/디자인 패턴] Singleton 패턴  (0) 2022.03.19
[공부/디자인 패턴] Strategy 패턴  (0) 2022.03.16