Factory Method

Simple Factory

Example

Pizza

public abstract class Pizza {
    public abstract void prepare();
    public abstract void bake();
    public abstract void cut();
    public abstract void box();
}

GreekPizza

public class GreekPizza extends Pizza {
    public void prepare() {
       System.out.println("prepare GreekPizza~");
    }

    public void bake() {
        System.out.println("bake GreekPizza~");
    }

    public void cut() {
        System.out.println("cut GreekPizza~");
    }

    public void box() {
        System.out.println("box GreekPizza~");
    }
}

CheesePizza

public class CheesePizza extends Pizza {
    public void prepare() {
       System.out.println("prepare CheesePizza~");
    }

    public void bake() {
        System.out.println("bake CheesePizza~");
    }

    public void cut() {
        System.out.println("cut CheesePizza~");
    }

    public void box() {
        System.out.println("box CheesePizza~");
    }
}

Simple factory

public class SimplePizzaFactory {
    public static Pizza CreatePizza(String orderType){
        Pizza pizza = null;
        if (orderType.equals("cheese")) {
            pizza = new CheesePizza();
        } else if (orderType.equals("greek")) {
            pizza = new GreekPizza();
        }
        return pizza;
    }
}

Usage

Pizza pizza;
pizza = SimplePizzaFactory.CreatePizza("cheese");
pizza = SimplePizzaFactory.CreatePizza("greek");

from: 設計模式乾貨系列:(一)簡單工廠模式

Factory Method

使用時機

你有一群繼承自相同介面的產品物件,

  • 你想要將產生哪一個具體產品物件的責任交由子類別來決定,可能是因為在編譯期間你並不知道要產生哪一個具體類別,又或者是你想要提供子類別產生具體產品類別的彈性。
  • 你允許客戶端傳入參數來選擇所要產生的具體類別。
  • 物件產生之後尚須經過經過適當的設定步驟才可以傳回給客戶端使用,如果可以將產生物件的過程從客戶端抽離出來,則可以避免客戶端產生重複的程式碼。

from: 重新整理Factory Method Pattern

from: Factory Method Pattern Tutorial with Java Examples

Example

Factory interface

 public interface PizzaFactory {
    public Pizza createPizza();
}

Implement factories

public class GreekPizzaFactory implements PizzaFactory {
    @Override
    public Pizza createPizza() {
        return new GreekPizza();
    }
}
 public class CheesePizzaFactory implements PizzaFactory {
    @Override
    public Pizza createPizza() {
        return new CheesePizza();
    }
}

Usage

public class OrderPizza {
    public static void main(String[] args) {
        PizzaFactory factory = new CheesePizzaFactory();
        Pizza pizza = factory.createPizza();
    }
}

from: 設計模式乾貨系列:(二)工廠方法模式