Search Results for 'Simple factroy'


1 POSTS

  1. 2008/07/23 팩토리 패턴의 소개 (2) by 정샘

팩토리 패턴의 소개 (2)

Head First Design Patterns - 10점
에릭 프리먼 외 지음, 서환수 옮김/한빛미디어

지난 번 설계한 "그냥피자" 클래스는 단점이 있었습니다. 주문할 피자의 종류가 많아질 수록 "그냥피자" 클래스가 복잡해지고 매번 코딩을 추가해야한다는 점입니다. 피자 종류를 추가하거나 제거할 때마다 코드를 고쳐야하므로 재활용성은 당연히 떨어집니다.
이러한 단점을 개선하기위해 변경이 일어나는 부분을 분리하고 피자의 종류 대로 피자 인스턴스가 만들어지도록 하겠습니다.

사용자 삽입 이미지
피자의 종류를 지정하는 부분을 '간단한피자팩토리' 클래스로 분리하였습니다. 이번 설계에서는 피자의 종류가 늘어나더라도 종류에 맞는 피자 클래스를 추가하고 '간단한피자팩토리' 클래스만을 변경하는 것으로 작업이 끝납니다.
이런 설계를 간단한 팩토리(simple factory)라고 하며 객체지향 설계 방법에 충실히 따른 모습이라고 할 수 있습니다. 하지만 아직은 패턴이라고 얘기할 수있는 정도는 아닙니다.
그럼 시퀀스 다이어그램으로 각 인스턴스가 어떤 순서로 메세지를 주고 받으면서 실행하는지 살펴보겠습니다.
사용자 삽입 이미지
고객이 '피자가게'에 '불고기피자'를 주문합니다. 피자가게에서는 주방('간단한피자팩토리')에 '불고기피자'를 만들도록 메세지를 전달하고 주방에서는 '불고기피자' 인스턴스를 만들어서 '피자가게' 인스턴스에게 돌려줍니다. 피자가게 인스턴스는 불고기피자 인스턴스를 사용하여 피자를 내놓습니다. 이때 수퍼 클래스인 '피자'를 이용하여 어떤 종류의 피자도 다룰 수 있게 됩니다.(다형성)
결국 어떤 종류의 피자를 선택할지는 간단한 피자 팩토리에서 결정을 하게 되는거죠.
실제 코드로 구현했습니다.
/* 피자와 그로부터 파생되어 구성된 피자들 */
// 각각의 피자들은 굽는 방법과 같은 것들이 다를 수 있기 때문에
// 피자는 추상 클래스로 선언합니다.
package exam.pattern.factoryMethod;

import java.util.ArrayList;
import java.util.Iterator;

public abstract class 피자 {
String 이름;
String 반죽방법;
String 소스;
@SuppressWarnings("unchecked")
ArrayList 토핑 = new ArrayList();

@SuppressWarnings("unchecked")
public void 재료준비() {
System.out.print("토핑재료 : ");
Iterator 토핑재료 = 토핑.iterator();

while (토핑재료.hasNext()) {
System.out.print(토핑재료.next() + ((토핑재료.hasNext()) ? ", " : ""));
}
System.out.println();
}

public void 빵굽기() {
System.out.println("25분간 350도에서 굽는다...");
}

public void 자르기() {
System.out.println("8조각으로 자른다...");
}

public void 포장하기() {
System.out.println("배달용 박스로 포장한다...");
System.out.println("'" + 이름 + "'의 포장이 끝났습니다.");
}
}


/* 피자가 실제로 구현된 구상 클래스 */
package exam.pattern.factoryMethod;

public class 불고기피자 extends 피자 {
@SuppressWarnings("unchecked")
public 불고기피자() {
이름 = "불고기피자";
반죽방법 = "얇은 반죽";
소스 = "토마토 소스";
토핑.add("불고기");
}
}


/* 피자가게와 간단한피자팩토리 */
// 피자의 선택은 간단한피자팩토리에서 실행시간에 결정됩니다.
package exam.pattern.factoryMethod;

public class 피자가게 {
private 간단한피자팩토리 factory;

public 피자가게(간단한피자팩토리 factory) {
this.factory = factory;
}

public void 주문하기(String 종류) {
피자 pizza;

pizza = factory.피자만들기(종류);
pizza.재료준비();
pizza.빵굽기();
pizza.자르기();
pizza.포장하기();
}
}


/* Simple Factory */
package exam.pattern.factoryMethod;

public class 간단한피자팩토리 {
public 피자 피자만들기(String 종류) {
피자 pizza;

if (종류.equals("치즈피자"))
pizza = new 치즈피자();
else if (종류.equals("불고기피자"))
pizza = new 불고기피자();
else
pizza = new 보통피자();

return pizza;
}
}


/* 테스트 코드 */
package exam.pattern.factoryMethod;

public class 간단한피자팩토리테스트 {

/**
* @param args
*/
public static void main(String[] args) {
new 피자가게(new 간단한피자팩토리()).주문하기("보통피자");;
}
}


이상으로 simple factory를 살펴보았습니다. 이 정도로도 상당히 객체지향적이면서 재활용성이 높은 유연한 코드가 만들어졌습니다.
다음은 본격적으로 '팩토리 메서드 패턴'을 소개하도록 하겠습니다.

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 정샘

2008/07/23 16:53 2008/07/23 16:53
, ,
Response
No Trackback , No Comment
RSS :
http://jeongsam.net/rss/response/7