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