Whiteship's Note

Simple Factory

Design Pattern : 2006.11.13 11:27


"new"는 "구상 객체"를 뜻합니다. 즉 new를 사용하는 것은 구상 클래스의 인스턴스를 만드는 것이고 특정 구현에 종속된다는 뜻입니다.

Pizza pizza = new CheesePizza();


이 코드에서 new를 사용했다고해서 무슨 문제가 있는 것은 아닙니다. 문제는 "변화" 입니다. Cheese 피자 말고 Pepperoni 피자와 Greek 피자도 있다고 한다면 Pizza를 선택할 때 다음과 같이 코드가 바뀌게 됩니다.

if(type.equals("cheese")
   pizza = new CheesePizza();
if(type.equals("greek")
   prizza = new GreekPizza();
if(type.equals("pepperoni")
   pizza = new PepperoniPizza();


새로운 클래스가 추가 될 때마다 코드를 고쳐야 되기 때문에 문제가 생길 수 있습니다. 이런 경우 변화에 닫혀 있다고 합니다. OCP 원칙에 반대되는 형태로군요. 이럴 때 바뀌는 부분을 밖으로 빼내어 Factory 메소드로 만들면 훨씬 보기 좋고 사용하기도 편해집니다.

factory method를 사용하지 않는 경우의 Pizza 클래스입니다.

이 때 분홍색 부분의 코드 때문에 새로운 피자가 추가 될 때 마다 이 클래스는 계속 변경이 되어야 합니다.

이런 변경되는 부분은 따로 빼내는 것은 종종 유용한 경우가 있었습니다.(Strategy Pattern에서 Duck의 행동을 인터페이스로 빼내는 예가 있었습니다.)

이런 부분을 다른 클래스로 빼내고 그 클래스에 factory의 레퍼런스 변수로 팩토리 메소드를 호출하여 Pizza를 받아오는 형식으로 개선 할 수 있겠습니다.


현재의 모습을 클래스 다이어그램으로 보면 다음과 같습니다.


PizzaStore에서 Pizza 인터페이스를 구현한 특정 클래스 들에 종속되고 있습니다. 이것을 개선하기 위해서 이제 분홍색 부분을 SimplePizzaFactory 클래로 옮기고 orderPizza 메소드는 다음과 같이 수정합니다.

소스보기

이렇게 하면 클래스 다이어그램은 다음과 같이 바뀌게 됩니다.


이렇게 PizzaStore에서 if-else if-else 와 같이 변하는 부분을 따로 클래스로 빼내게 되면 PizzaStore는 새로운 Pizza가 추가 되거나 메뉴에서 사라지더라도 소스코드가 변경될 일은 없습니다. 다만 SimplePizzaFactory의 코드는 계속 변경이 되겠지요.

지금까지 본 것을 하나의 패턴으로 정의 할 수는 없다고 합니다. 하지만 설계와 관련된 기술서를 읽다보면 팩토리 패턴, 팩토리 메소드라는 단어가 나올때 위의 그림을 떠올려 보면 대부분은 쉽게 이해가 될 것입니다.

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

State Pattern 예제  (2) 2006.12.10
캡슐화  (0) 2006.12.09
H.F. Design Pattern 트집잡기  (4) 2006.12.09
Design Pattern 기말고사  (0) 2006.12.08
Template Method Pattern을 사용하는 QuickSorting  (0) 2006.12.08
Simple Factory  (4) 2006.11.13
Principle of Least Knowledge  (4) 2006.11.11
Adapter Pattern  (0) 2006.11.11
엔터프라이즈 컴퓨팅 중간고사 5)  (0) 2006.10.23
엔터프라이즈 컴퓨팅 중간고사 2), 3), 4)  (0) 2006.10.23
엔터프라이즈 컴퓨팅 1)-2  (0) 2006.10.23
top

  1. 현동규 2006.11.13 12:09 PERM. MOD/DEL REPLY

    굉장히 쓰임새가 많은 패턴이지요..

    쓰고나면 깔끔해지고요~~

    강추~

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.11.13 12:27 신고 PERM MOD/DEL

    ㅋㅋ아니 알면서 왜 ppt에는 모른다고 써둔거야? 괜히 정리했구만~

  2. Favicon of https://zerry82.tistory.com BlogIcon 동자~ 2006.11.13 13:06 신고 PERM. MOD/DEL REPLY

    웁스 그건 static이 있기때문에 static 팩토리를 만들어야 하는 이유를
    궂이 몰라서용~_~

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2006.11.13 16:53 신고 PERM MOD/DEL

    static factory? 아무래도 편의성 때문에 그런것 아닐까 내가 위에 써놓은 예제에도 보면 저 클래스 안에 factory 메소드 인 인스턴스 메소드 하나가 덜렁 있자나?

    근데 static으로 해두면 굳이 저 클래스의 객체를 만들필요가 없지 그렇게 되면 굳이 PizzaStore 클래스에서 factory 타입의 멤버 변수를 가지고 있을 필요도 없기 때문에..

    결국 편의성 때문에 그렇게 하는 것 같에... 별로 객체지향 적이진 않지만 목표는 객체지향의 실현이 아니라 프로그램을 만드는 것이니깐..(이 말은 영회형한테 들었던 것 같군...)

Write a comment.




: 1 : ··· : 17 : 18 : 19 : 20 : 21 : 22 : 23 : 24 : 25 : ··· : 48 :