其实觉得简单工厂模式严格来说算不上是设计模式,它只是纯粹利用继承,实现了类的多态性而已。但是当需要扩展或者修改业务逻辑的时候,这个方式就会显得力不从心了。得按照设计模式的原则,将变化和不变的部分分离并且分别封装取来,其实把变化的部分封装出来可以方便以后业务的扩展,对编程量大大减少。譬如好像head first设计模式中举的一个pizzaStore例子,当只有一个orderPizza业务的时候,决定订做哪一种pizza,如果使用简单工厂模式,就得在该方法中用判断的方式实例化所需要的对象,代码:
Pizza orderPizza(string type)
{
Pizza pizza=null;
switch(type)
{
case "a":
pizza =new aPizza();
break;
case "b":
pizza =new bPizza();
break;
case "c":
pizza =new cPizza();
break;
case "d":
pizza =new dPizza();
break;
}
}
从上面的代码来看,就算把变化的部分分离封装起来也只是简单的把类的实例化移到了一个类中来实例,好像用处不大见效,但是别忘了业务除了订做pizza,还有运送pizza的业务之类,如果说在每一个这些业务当中都需要这么一段代码来实例化对象的话,这将是一个很繁琐的工作。而且从设计模式的原则来看,分离变化的部分封装起来遵循对扩展开放,对修改封闭的原则。其实前面所说的把变化的部分分离封装出来就是使用到了现在会经常用到的Factory method设计模式,它很好的遵循了设计模式的原则,做到了面向接口编程,在petshop等架构也应用到了,至于具体的例子大家可以参考Terry Lee和吕震宇老师的程序代码。
在这里还想说一下的就是,其实感觉抽象工厂纯粹是对工厂方法的一个进一步的抽象而已,譬如就好像head first设计模式中举的例子一样,假如现在不单只需要制造不同口味的pizza,而且随着知名度越来越高,pizza就会在很多地方建立新的店铺,而每个地方对每一种类型的pizza又会有不同口味,这个时候就可以考虑使用抽象工厂模式,把各地工厂抽象出来。