본문 바로가기
SWE/C++ OOP

[디자인 패턴] Factory Method Pattern 팩토리 메소드 패턴

by S나라라2 2021. 7. 22.
반응형

 

팩토리 메소드 패턴의 기조인 '심플 팩토리'를 먼저 학습하면 이해가 쉽다.

https://flower0.tistory.com/414

 

[디자인 패턴] Simple Factory 심플팩토리

팩토리 패턴에는 다음과 같이 두 가지 패턴이 있다. - 팩토리 메소드 패턴 Factory method Pattern - 추상 팩토리 패턴Abstract Factory Pattern 이 두 가지 패턴을 공부하기위해, 두 패턴의 베이스인 'Simple Fac..

flower0.tistory.com

 

 

 

팩토리 메소드 패턴 Factory Method Pattern

 

[개념] 팩토리 메소드 패턴이란?

객체를 생성해내는 공장을 '인스턴스화'하여, 어떤 객체를 생성할지는 서브클래스에게 맡기는 방법이다.  

 

'Simple factory'에서 본 PizzaStore를 예로 들어보자.

 

PizzaStore 내부에 객체 생성만을 처리하는 createPizza()메소드를 추상 메소드로 선언한다. ->인스턴스화

그리고 PizzaStore를 상속받은 NYPizzaStore과 ChicagoPizzaStore에서 createPizza()메소드를 구현하며, 직접 필요한 객체를 생성한다. ->서브클래스에서 어떤 객체를 생성할지 결정한다.

Method Factory Pattern

위와 같이 팩토리 메소드 패턴을 이용하면, 피자를 만드는 활동(prepare, bake, cut, box)은 전부 PizzaStore에 국한시키면서도 분점(NYPizzaStore, ChicagoPizzaStore)마다 고유 스타일의 피자를 생성할 수 있다.

다시 정리하면, 피자 가게와 피자 제작 과정 전체를 하나로 묶어주는 프레임 워크를 만들었음에도 불구하고, 유연성도 잃지 않았다.

 

// PizzaStore
public abstract class PizzaStore {
	public Pizza orderPizza(String type) {
    	Pizza pizza;
        
        pizza = createPizza(type);  // 팩토리 객체가 아닌 Pizza store에 있는 createPizza를 호출함
        
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        
        return pizza;
	}
    
    abstract Pizza createPizza(String type); // 팩토리 메소드
}

Pizza생성은 서브클래스의 createPizza()를 통해서 진행되고, 나머지 피자 제작 과정은 PizzStore에서 처리한다.

 

// NYPizzaStore
public class NYPizzaStore extends PizzaStore {
	Pizza createPizza(String item) {
    	if( item.equals("cheese") )
        	return new NYStyleCheesePizza();
        else if( item.equals("pepperoni") )
        	return new NYStylePepperoniPizza();
        else if( item.equals("clam") )
        	return new NYStyleClamPizza();
        else
        	return null;
     }
}

PizzaStore의 서브클래스인 NYPizzaStore에서 뉴욕스타일에 맞는 피자 객체를 생성할 수 있다.

 

(ChicagoPizzaStore의 코드는 NYPizzaStore와 동일하기 때문에 생략하였다.)

 

 

Simple Factory와 Factory Method pattern의 차이점

 

- Simple factory :

객체 생성만 처리하는 공장(클래스)을 별도로 둔다.

 

- Factory Method Pattern :

객체를 생성하는 부분을 인스턴스화하여, 서브 클래스에서 직접 객체를 만들 수 있게 한다. 

(객체 생성만 처리하는 추상 method를 둔다.)

심플 팩토리와 비교하자면, 생성하는 제품을 서브클래스에서 마음대로 변경할 수 있다는 큰 유연성을 주고 있다.

 

 

[장점] Factory Method Pattern 사용의 장점

가장 큰 부분은 제품을 생산하는 부분과 사용하는 부분을 분리시킬 수 있다는 점이다.

(다시 말해, Creator 클래스가 ConcreteProduct와 느슨하게 결합되어 있다.)

따라서 다른 제품을 추가하거나 제품 구성을 변경시키더라도 제품을 생산하는 부분(Creator)은 건드릴 필요가 없다.

-> 결론은 유연성과 확장성이 뛰어남

 


나아가 추상팩토리패턴에 대해 공부하려면 아래 링크에 정리해두었다.

https://flower0.tistory.com/416

 

[디자인 패턴] Abstract Factory Pattern 추상 팩토리 패턴

추상팩토리패턴을 공부하기 전에 '심플 팩토리'와 '팩토리 메소드 패턴'을 먼저 공부하면, 이해가 수월할 것이다. https://flower0.tistory.com/414 [디자인 패턴] Simple Factory 심플팩토리 팩토리 패턴에는

flower0.tistory.com

 

반응형