接上文。
确保原料的一致
你打算建造一家生产原料的工厂,并将原料运送到各家加盟店。但是加盟店在不同的区域,酱料是不一样的。你需要准备不同的原料。考虑到未来的扩展,你需要各个地区的原料。
建造原料工厂
现在,我们要建造一个工厂来生产原料。这个工厂将负责创建原料家族中的每一种原料。
开始先为工厂定义个接口,这个接口负责创建所有的原料:
public interface PizzaIngredientFactory {
// 接口中,每个原料都有一个对应的方法创建该原料
// 这里有许多新类,每个原料都是一个类
public Dough createDough();
public Sauce createSauce();
public Cheese createCheese();
public Veggies[] createVeggies();
public Pepperoni createPepperoni();
public Clams createClam();
}
要做的事情
1、为每一个区域建造一个工厂。你需要创建一个继承自PizzaIngredientFactory的子类来实现每一个创建方法。
2、实现一组原料类供工厂使用。这些类可以在核实的区域间共享。
3、然后你仍然需要将这一切组织起来,将新的原料工厂整合进旧的PizzaStore代码中。
创建纽约原料工厂
具体创建纽约原料工厂的实现。这工厂专精于大蒜番茄酱料、Reggiano干酪、新鲜蛤蜊…
public class NYPizzaIngredientFactory implements PizzaIngredientFactory {
// 对于原料家族内的每一种原料,我们都提供了纽约的版本。
public Dough createDough() {
return new ThinCrustDough();
}
public Sauce createSauce() {
return new MarinaraSauce();
}
public Cheese CreateCheese() {
return new ReggianoCheese();
}
public Veggies[] createVeggies() {
Veggies veggies[] = { new Garlic(), new Onion(), new Mushroom(), new RedPepper() };
return veggies;
}
public Pepperoni createPepperoni() {
return new SlicedPepperoni();
}
// 纽约靠海,所以有新鲜的蛤蜊。芝加哥就必须使用冷冻的蛤蜊。
public Clams createClam() {
return new FreshClams();
}
}
重做披萨
工厂一切就绪,准备生产高质量的原料了。现在我们只需要重做比萨,好让它们只适用工厂生产出来的原料。
我们先从抽象的Pizza类开始,把原本的prepare()方法声明成抽象。在这个方法中,我们需要收集比萨所需的原料,而这些原料当然是来自原料工厂了。
abstract void prepare();
未完待续。