工厂模式主要是用来创建对象。文中的例子,不同的pizza store制作不同种类的pizza。对于不同的pizza store可以抽象出来一个抽象的pizza store类,对于不同种类的pizza也可以抽象出来一个抽象的pizza类。pizza store需要实现制作pizza的方法,所以在实例化具体pizza store对象后,调用orderPizza根据传入的不同pizza类型,创建具体的pizza,之后委托这个具体的pizza对象进行准备原料、烤焙、切块、和装箱,这一系列操作。这样做的优点在于
将创建具体对象(具体的pizza)的工作延迟到子类(具体的pizza store)进行,达到对象创建的过程封装的目的,
产品的“实现“从”使用“中解耦。
orderPizza在pizzaStore的基类中定义,
不需要知道哪个具体的pizza参与操作,这就是
解耦。工厂模式将创建对象的工作集中在一个对象或一个方法中,避免代码重复,方便维护。并且遵循依赖倒置原则,无论是高层组件pizza store,还是底层组件具体的pizza,都依赖于抽象。缺点是pizza store依赖于具体pizza的实现,当pizza的种类增加时,createPizza方法也要做修改。
Pizza *pizzaStore::orderPizza(int type)
{
Pizza *pizza;
pizza = createPizza(type);
pizza->prepare();
pizza->bake();
pizza->cut();
pizza->box();
return pizza;
}
Pizza *concretePizzaStoreA::createPizza(int type)
{
if(type == PIZZA_A)
return new concretePizzaA();
else(type == PIZZA_B)
return new concretePizzaB();
}
client:
// 1.创建一个pizza店
PizzaStore *pizzaStore = new concretePizzaStoreA();
// 2.下单
pizzaStore->orderPizza(type);
// 3. orderPizza中调用createpizza创建具体pizza对象
// 4. 对pizza准备原料-->烤焙-->切块-->装箱。