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