工廠模式(2)

Demo場景:PizzaStore添加加盟店NYStylePizzaStore,PizzaStore需要控制Pizza製作流程,不控制具體Pizza的口味,加盟店NYStylePizzaStore可以修改Pizza。

相較於上一篇,這裏主要關注通過抽象工廠模式,解決不同原料的問題。

(1)總店還是作爲加盟店的基類:PizzaStore

package designpattern.factory.pizzaingredient;

public abstract class PizzaStore {

    public Pizza orderPizza(String type){
        Pizza pizza;

        pizza = createPizza(type);

        pizza.prepare();
        pizza.bake();
        pizza.cut();
        pizza.box();

        return pizza;
    }

    protected abstract Pizza createPizza(String type);
}

(2)Pizza原料工廠:PizzaIngredientFactory

package designpattern.factory.pizzaingredient;

public interface PizzaIngredientFactory {

    public Dough createDough();
    public Sauce createSauce();
    public Cheese createCheese();
    public Veggies[] createVeggies();
    public Pepperoni createPepperoni();
    public Clams createClam();
}

(3)具體的一種類型原料工廠:CheesePizza

package designpattern.factory.pizzaingredient;

public class CheesePizza extends Pizza {

    PizzaIngredientFactory ingredientFactory;

    public CheesePizza(PizzaIngredientFactory ingredientFactory){
        this.ingredientFactory = ingredientFactory;
    }

    @Override
    void prepare() {
        System.out.println("Preparing " + name);
        dough = ingredientFactory.createDough();
        sauce = ingredientFactory.createSauce();
        cheese = ingredientFactory.createCheese();
    }

}

(4)具體加盟店:NYPizzaStore

package designpattern.factory.pizzaingredient;

public class NYPizzaStore extends PizzaStore{

    @Override
    protected Pizza createPizza(String type) {
        Pizza pizza = null;
        PizzaIngredientFactory ingredientFactory = new NYPizzaIngredientFactory();
        if(type.equals("cheese")){
            pizza = new CheesePizza(ingredientFactory);
            pizza.setName("New York Style Cheese Pizza");
        }else if(type.equals("veggie")){
            pizza = new VeggiePizza(ingredientFactory);
            pizza.setName("New York Style Veggie Pizza");
        }else if(type.equals("clam")){
            pizza = new ClamPizza(ingredientFactory);
            pizza.setName("New York Style Clam Pizza");
        }else if(type.equals("pepperoni")){
            pizza = new PepperoniPizza(ingredientFactory);
            pizza.setName("New York Style Pepperoni Pizza");
        }
        return pizza;
    }

}

加盟店生產pizza演示:

package designpattern.factory.pizzaingredient;

public class PizzaTest {

    public static void main(String[] args) {
        PizzaStore pizzaStore = new NYPizzaStore();

        Pizza pizza = pizzaStore.orderPizza("cheese");
        System.out.println("A " + pizza.getName() + " had been ordered. ");
    }

}
發佈了44 篇原創文章 · 獲贊 4 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章