디자인 패턴 - 프로토타입 패턴

안성은·2022년 4월 12일
0

Disign Pattern

목록 보기
5/9

프로토타입 패턴

  • 정의

    • 어떤 클래스의 인스턴스를 만드는 것이 자원/시간을 많이 잡아먹거나 복잡한 경우에 사용하는 패턴
  • 사용하는 이유

    • 프로토타입 패턴은 원본 객체를 새로운 객체에 복사하여 필요에 따라 수정하는 메커니즘을 제공한다.
    • 원본 객체의 구체적인 형식을 몰라도 객체를 생성할 수 있지만 복사본을 만드는 경우가 복잡할 수도 있다.
  • 방법

    • clone 메소드나 역직렬화를 사용해서 구현할 수 있다.
  • 레거시 코드
    • 객체를 생성할 때마다 new 키워드를 사용해서 새로운 객체 생성
public class LegacyPizzaStore {
    public static void main(String[] args) {
        Pizza pizza = new Pizza();
        pizza.makePizzaToppingList();

        Pizza newPizza1 = new Pizza();
        newPizza1.makePizzaToppingList();

        Pizza newPizza2 = new Pizza();
        newPizza2.makePizzaToppingList();

        newPizza1.getPizzaToppingList().add("gorgonzola");
        newPizza2.getPizzaToppingList().add("pineapple");

        System.out.println(pizza);
        System.out.println(newPizza1);
        System.out.println(newPizza2);
    }
}
  • 개선 코드
    • Cloneable을 사용해서 원본 객체를 복사 후 수정.
public class Pizza implements Cloneable{

    private String name;
    private List<String> pizzaToppingList;

    public Pizza() {
        this.pizzaToppingList = new ArrayList<>();
    }

    public Pizza(List<String> pizzaToppingList) {
        this.pizzaToppingList = pizzaToppingList;
    }

    public List<String> getPizzaToppingList() {
        return pizzaToppingList;
    }

    public void makePizzaToppingList() {
        this.pizzaToppingList.add("cheese");
        this.pizzaToppingList.add("ham");
        this.pizzaToppingList.add("tomato");
        this.pizzaToppingList.add("potato");
    }

    @Override
    protected Object clone() throws CloneNotSupportedException{
        Pizza newPizza = (Pizza) super.clone();
        newPizza.pizzaToppingList = new ArrayList<>(this.pizzaToppingList);
        return newPizza;
    }

    @Override
    public String toString() {
        return pizzaToppingList.toString();
    }
}
  • TEST CODE

    public class PizzaStore {
       public static void main(String[] args) throws CloneNotSupportedException{
    
           Pizza pizza = new Pizza();
           pizza.makePizzaToppingList();
    
           Pizza clonePizza1 = (Pizza) pizza.clone();
           Pizza clonePizza2 = (Pizza) pizza.clone();
    
           List<String> newPizza1 = clonePizza1.getPizzaToppingList();
           List<String> newPizza2 = clonePizza2.getPizzaToppingList();
    
           newPizza1.add("gorgonzola");
           newPizza2.add("pineapple");
    
           System.out.println(pizza);
           System.out.println(newPizza1);
           System.out.println(newPizza2);
       }
    }
  • 참고

0개의 댓글