Design Pattern

Prototype

Jungsoomin :) 2020. 11. 29. 19:24

프로토타입 패턴이란 , 대략적인 샘플을 만드는 것이다.

  • 객체를 생성할 때 비용이 많이 들거나.
  • 비슷한 객체가 있는 경우 사용한다.

자바에서는 Cloneable 을 상속하거나 Object.clone 메서드를 사용하는 것으로 깊은 복사의 기능을 제공한다.

 

해당 패턴은 깊은 복사얕은 복사와도 관련이 깊다.


사용하는 이유

  • 시스템이 어떤 생성 클래스를 사용하는지 가려준다.
  • 어떻게 인스턴스를 만들고 결합하는지를 가려준다.

new 연산자를 사용하는 것보다 clone() 을 사용하여 객체 생성의 수정점을 유연하게 가져가기위한 전략이다.

 

  1. 즉, 프로토타입 패턴에는 생성할 추상클래스가 선언된다.
  2. 추상클래스는 clone() 을 사용하기위해 Cloneable 인터페이스를 구현해야한다.
  3. 생성할 추상클래스를 구현하는 Concrete 클래스가 작성된다.
  4. 깊은 복사와 같은 복사를 잘 구별하여 사용해야한다.

Cookie 추상클래스와 구현클래스, 이를 저장하는 CookieMachin, 쿠키 타입을 결정하는 Enum 클래스 CookieType


 

public abstract class Cookie implements Cloneable {
    protected CookieType cookieType;

    public abstract void bake();

    @Override
    public Object clone() throws CloneNotSupportedException {
        try{
            Cookie cookie = (Cookie) super.clone();
            return cookie;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }
}

//
public class CoconutCookie extends Cookie {

    public CoconutCookie() {
        this.cookieType = CookieType.COCONUT;
    }

    @Override
    public void bake() {
        System.out.printf("해당 쿠키 타입은 %s 입니다.%n",this.cookieType);
    }
}

//
public class DefaultCookie extends Cookie {

    public DefaultCookie() {
        this.cookieType = CookieType.DEFAULT;
    }

    @Override
    public void bake() {
        System.out.printf("해당 쿠키 타입은 %s 입니다.%n",this.cookieType);
    }
}

//Enum
public enum CookieType {
    DEFAULT , COCONUT
}

//Client
// 클라이언트
public class CookieMachine {

    private Map<CookieType,Cookie> cookies;

    public CookieMachine() {
        this.cookies = new HashMap<>();
    }

    public void SetCookie(Cookie... cookies){
        for (Cookie cookie : cookies) {
            this.cookies.put(cookie.cookieType, cookie);
        }
    }

    public Cookie makeCookie(CookieType cookieType) throws CloneNotSupportedException {
        Cookie clone = (Cookie)this.cookies.get(cookieType).clone();
        return clone;
    }
}

//Main
public class Main {
    public static void main(String[] args) throws CloneNotSupportedException {
        Cookie cookie1 = new CoconutCookie();

        Cookie cookie2 = new DefaultCookie();

        CookieMachine cookieMachine = new CookieMachine();
        cookieMachine.SetCookie(cookie1,cookie2);

        for(int i = 0; i<2; i++){
            Cookie makeCookie = cookieMachine.makeCookie(CookieType.DEFAULT);
            System.out.println(makeCookie.toString());
            makeCookie.bake();
        }
        System.out.println("==================================================");

        for(int i=0; i<2; i++){
            Cookie makeCookie = cookieMachine.makeCookie(CookieType.COCONUT);
            System.out.println(makeCookie.toString());
            makeCookie.bake();
        }
    }
}

//로그
Prototype.DefaultCookie@74a14482
해당 쿠키 타입은 DEFAULT 입니다.
Prototype.DefaultCookie@5cad8086
해당 쿠키 타입은 DEFAULT 입니다.
==================================================
Prototype.CoconutCookie@6e0be858
해당 쿠키 타입은 COCONUT 입니다.
Prototype.CoconutCookie@61bbe9ba
해당 쿠키 타입은 COCONUT 입니다.

이렇게 추상화한 클래스에서 부터 비슷한 모양새를 한 객체, DB 에서 끌어와야할(소모비용이 높은) 객체를 new 연산자 사용없이 clone() 을 호출하여 만드는 방법을 취하여, 프로그램 메모리 소모를 줄인다.

'Design Pattern' 카테고리의 다른 글

Builder  (0) 2020.11.29
Prototype - 깊은 복사와 얕은 복사, Cloneable  (0) 2020.11.29
SingleTon Pattern  (0) 2020.11.24
Factory Method  (0) 2020.11.24
Template Method  (0) 2020.11.23