프로토타입 패턴이란 , 대략적인 샘플을 만드는 것이다.
- 객체를 생성할 때 비용이 많이 들거나.
- 비슷한 객체가 있는 경우 사용한다.
자바에서는 Cloneable 을 상속하거나 Object.clone 메서드를 사용하는 것으로 깊은 복사의 기능을 제공한다.
해당 패턴은 깊은 복사와 얕은 복사와도 관련이 깊다.
사용하는 이유
- 시스템이 어떤 생성 클래스를 사용하는지 가려준다.
- 어떻게 인스턴스를 만들고 결합하는지를 가려준다.
new 연산자를 사용하는 것보다 clone() 을 사용하여 객체 생성의 수정점을 유연하게 가져가기위한 전략이다.
- 즉, 프로토타입 패턴에는 생성할 추상클래스가 선언된다.
- 추상클래스는 clone() 을 사용하기위해 Cloneable 인터페이스를 구현해야한다.
- 생성할 추상클래스를 구현하는 Concrete 클래스가 작성된다.
- 깊은 복사와 같은 복사를 잘 구별하여 사용해야한다.
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 |