seops

[Concepts] Factory Method Pattern 본문

Android/Design Pattern

[Concepts] Factory Method Pattern

seops 2020. 4. 14. 01:41

[ 정의 ]


-> 팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는

    서브 클래스에서 결정하게 만듦

 

Factory Method Pattern Class Diagram

 

 

[ 구현 ]


public abstract class Pizzastore {
    public Pizza orderPizza(String type) {
        Pizza pizza;
        
        pizza = createPizza(type);
        
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        
        return pizza;
    }

    abstract Pizza createPizza(String type);
}



public class NYPizzaStroe extends PizzaStore {
    Pizza createPizza(String item) {
        if(item.equals("cheese") {
            return new NYStyleCheesePizza();
        } else if(item.equals("veggie") {
            return new NYStyeVeggiePizza();
        }....
    }
}



public class PizzaTestDrive {
    public static void main(String[] args) {
        PizzaStore nyStore = new NYPizzaStore();
        PizzaStore chicagoStore = new ChicagoPizzaStore();
        
        
        Pizza pizza = nyStore.orderPizza("cheese");
        System.out.println("Ethan ordered a " + pizza.getName() + "\n");
        
        pizza = chicagoStore.orderPizza("cheese");
        System.out.println("Joel ordered a " + pizza.getName() + "\n");
    }
}

- abstract Product factoryMethod(String type) ~ abstract Pizza createPizza(String type);

-> 팩토리 메소드는 객체 생성을 처리하며, 팩토리 메소드를 이용하면 객체를 생성하는 작업을 서브클래스에 캡슐화시킬 수 있다.

-> 이렇게 하면 슈퍼클래스에 있는 클라이언트 코드와 서브클래스에 있는 객체 생성 코드를 분리할 수 있다.

 

 

[ 보충 ]


1. 질의 응답

Q. 간단한 팩토리와 팩토리 메소드 패턴의 차이점을 아직 잘 모르겠어요. 팩토리 메소드 패턴에서는 피자를 리턴하는 클래스가 서브 클래스라는 덤을 제외하면 거의 똑같잖아요. 조금 더 자세히 설명해 주실 수 있나요?

A. 팩토리 메소드 패턴이 간단한 팩토리와 상당히 비슷하다는 지적은 맞습니다. 하지만 간단한 팩토리는 일회용 처방에 불과한 반면, 팩토리 메소드 패턴을 이용하면 어떤 구현을 사용할지를 서브클래스에서 결정하는 프레임워크를 만들 수 있다는 결정적인 차이점이 있다.

즉, 간단한 팩토리의 경우, 생성하는 제품을 마음대로 변경할 수 없다.

public class PizzaStore {
    SimplePizzaFactory factory;
    
    public PizzaStore(SimplePizzaFactory factory) {
        this.factory = factory;
    }
    
    public Pizza orderPizza(String type) {
        Pizza pizza;
        
        pizza = factory.createPizza(type);
        
        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();
        
        return pizza;
    }
}


// 실 사용 클래스
public void main() {
    NYPizzaFactory nyFactory = new NYPizzaFactory();
    PizzaStore nyStore = new PizzaStore(nyFactory);
    nyStore.order("Veggie");
    
    ChicagoPizzaFactory chicagoFactory = new ChicagoPizzaFactory();
    PizzaStore chicagoStore = new PizzaStore(chicagoFactory);
    chicagoStore.order("Veggie");
}

 

2. 팩토리 메소트 패턴 장점

- 구상 클래스를 바탕으로 코딩을 하면, 나중에 코드를 수정해야 할 가능성이 높아지고 유연성이 떨어진다.

- 인터페이스를 바탕으로 코딩을 하면, 다형성 덕분에 어떤 클래스든 특정 인터페이스만 구현하면 사용할 수 있다.

  반대로 코드에서 구상 클래스를 많이 사용하면, 새로운 구상 클래스가 추가될 때마다 코드를 고쳐야 하기 때문에 문제 발생 가능성이 높음

 

 

 

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

[Development] Observer Pattern  (0) 2020.03.30
[Concepts] Observer Pattern  (0) 2020.03.30
Comments