Design Pattern

Chapter 2 工廠方法模式

工廠方法模式(Factory Pattern)屬於『創建型模式』。

目的:

定義了一個建立物件的介面,但由次類別決定實體化的類別為何者。工廠方法讓類別將實體化的動作,交由次類別進行。 工廠方法是一個抽象的方法,依賴次類別負責物件的建立。

組成:

  1. 物件介面(Product):抽象產品
  2. 物件實作(ConcreteProduct):具體產品
  3. 工廠超類別(Factory):內含用以產生物件的抽象方法
  4. 工廠子類別(ConcreteFactory):實作產生物件的方法

程式碼:

Step1

public interface Pizza {
    public String getName();
    public void prepaid();
    public void baking();
}

Step2

public class NYBeefPizza implements Pizza{
    @Override
    public String getName() {
        return "牛肉Pizza";
    }

    @Override
    public void prepaid() {
        System.out.println(getName()+" 準備中...");
        System.out.println(getName()+" 加入紐約特製醬料...");        
    }

    @Override
    public void baking() {
        System.out.println(getName()+" 烘烤中...");    
    }
}


public class TPSeafoodPizza implements Pizza{
    @Override
    public String getName() {
        return "海鮮Pizza";
    }

    @Override
    public void prepaid() {
        System.out.println(getName()+" 準備中...");
        System.out.println(getName()+" 加入臺北特製醬料...");        
    }

    @Override
    public void baking() {
        System.out.println(getName()+" 烘烤中...");    
    }
}

Step3

public abstract class PizzaFactory {

    public enum PIZZATYPE{
        BEEF,SEAFOOD;
    }

    public Pizza orderPizza(PIZZATYPE pizzaType){
        System.out.println(getClass()+" 開始準備Pizza");
        Pizza pizza = createPizza(pizzaType);
        pizza.prepaid();
        pizza.baking();
        return pizza;
    }

    protected abstract Pizza createPizza(PIZZATYPE pizzaType);
}

Step4

public class NewYorkPizzaFactory extends PizzaFactory {

    @Override
    protected Pizza createPizza(PIZZATYPE pizzaType) {
        Pizza pizza = null;
        if(pizzaType == PIZZATYPE.BEEF){
            pizza = new NYBeefPizza();
        }else if(pizzaType == PIZZATYPE.SEAFOOD){
            pizza = new NYSeafoodPizza();
        }
        return pizza;
    }
}


public class TaipeiPizzaFactory extends PizzaFactory {

    @Override
    protected Pizza createPizza(PIZZATYPE pizzaType) {
        Pizza pizza = null;
        if(pizzaType == PIZZATYPE.BEEF){
            pizza = new TPBeefPizza();
        }else if(pizzaType == PIZZATYPE.SEAFOOD){
            pizza = new TPSeafoodPizza();
        }
        return pizza;
    }
}

Step5

public static void main(String args[]) {

        String people1 = "客人1";
        String people2 = "客人2";
        System.out.println(people1+ " 想購買紐約pizze");
        System.out.println(people2+ " 想購買臺北pizza");

        PizzaFactory callFactory = null;

        callFactory = new NewYorkPizzaFactory();
        Pizza nySeafoodPizza= callFactory.orderPizza(PIZZATYPE.SEAFOOD);
        System.out.println(people1 + " get:"+nySeafoodPizza.getName());

        callFactory = new TaipeiPizzaFactory();
        Pizza tpBeefPizza= callFactory.orderPizza(PIZZATYPE.BEEF);
        System.out.println(people2 + " get:"+tpBeefPizza.getName());
    }

Step6(Output)

客人1 想購買紐約pizze
客人2 想購買臺北pizza
NewYorkPizzaFactory 開始準備Pizza
海鮮Pizza 準備中...
海鮮Pizza 加入紐約特製醬料...
海鮮Pizza 烘烤中...
客人1 get:海鮮Pizza
TaipeiPizzaFactory 開始準備Pizza
牛肉Pizza 準備中...
牛肉Pizza 加入臺北特製醬料...
牛肉Pizza 烘烤中...
客人2 get:牛肉Pizza

優點:

  1. 工廠模式創建客戶所需要的產品,也對客戶隱藏了具體產品實做的細節,客戶只需要關心產品對應的工廠,不需要知道創建的細節。
  2. 工廠角色和產品角色的多態性設計是工廠模式的關鍵。
  3. 工廠模式在系統中增加新產品時,只需要添加一個具體工廠和具體產品即可。而這樣系統的擴展性也變得很好,符合”開閉原則“。

缺點:

  1. 系統中的類別數量增加,會增加系統的複雜度,帶給系統額外的開銷。