工厂模式(2)

来源:互联网 发布:我是传奇结局知乎 编辑:程序博客网 时间:2024/06/03 19:18

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. ");    }}
0 0