工廠方法模式

1.介紹

它是定義一個創建對象的接口,但由子類決定要實例化的類是哪一個,工廠方法讓類把實例化推遲到子類中。

2.小栗子

Pizza店做Pizza

3.代碼實現

// Pizza抽象類
public abstract class Pizza {
    protected PizzaIngredientFactory factory = null;

    public Pizza(PizzaIngredientFactory factory) {
        this.factory = factory;
    }

    public abstract String getName();

    public void prepare() {
        System.out.println("Dough:" + factory.createDough().getName());
        System.out.println("Sauce:" + factory.createSauce().getName());
        System.out.println(this.getName() + " prepare success.");
    }
}

// 紐約Pizza
public class NYPizza extends Pizza {
    public NYPizza(PizzaIngredientFactory factory) {
        super(factory);
    }

    @Override
    public String getName() {
        return "NY Pizza";
    }
}

// 西雅圖Pizza
public class SeattlePizza extends Pizza {
    public SeattlePizza(PizzaIngredientFactory factory) {
        super(factory);
    }

    @Override
    public String getName() {
        return "Seattle Pizza";
    }
}

// Pizza店 做Pizza
public abstract class PizzaStore {
    public void orderPizza(PizzaIngredientFactory factory) {
        Pizza pizza = createPizza(factory);
        pizza.prepare();
    }
    
    // 工廠方法模式
    protected abstract Pizza createPizza(PizzaIngredientFactory factory);
}

// 紐約PizzaStore
public class NYPizzaStore extends PizzaStore {
    @Override
    protected Pizza createPizza(PizzaIngredientFactory factory) {
        return new NYPizza(factory);
    }
}

4.測試

public class FactoryMethodPatternDemo {
    public static void main(String[] args) {
        PizzaIngredientFactory nyFactory = new NYPizzaIngredientFactory();
        PizzaIngredientFactory seattleFactory = new SeattlePizzaIngredientFactory();

        PizzaStore pizzaStore = new NYPizzaStore();
        pizzaStore.orderPizza(seattleFactory);

        pizzaStore.orderPizza(nyFactory);
    }
}

5.總結

紐約可以做紐約/西雅圖等地區風格的Pizza,而且Pizza本身風格也是可以擴展的。

源碼地址:https://gitee.com/jsjack_wang/JavaDemo

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,287評論 25 708
  • 簡單工廠模式雖然簡單,但存在一個很嚴重的問題。當系統中需要引入新產品時,由于靜態工廠方法通過所傳入參數的不同來創建...
    justCode_閱讀 1,206評論 1 9
  • 模式介紹 工廠方法模式是應用最廣泛的模式之一,也是創建型模式之一。工廠方法模式指的是定義出一個用于創建對象的接口,...
    黑色小老虎丶閱讀 706評論 0 2
  • 170427 早上開會討論小組作業,要開始準備pre。其實有的時候能力有限,可還是想要承擔相對更多的任務。 pre...
    XxXxXxN閱讀 146評論 0 0
  • 概述 Xcode中的iOS 7圖標大小概述。由于有相當多的iOS設備,它可以是一個特別苛刻與所有這些不同的分辨率。...
    弗利撒閱讀 565評論 0 0