工厂模型——简单工厂和工厂方法
书上举的例子是关于pizza的,例子很形象。工厂模型的目的就是要“对扩展开放,对修改封闭”。
首先,我们想一个问题,new有什么不对?
针对接口编程,可以隔离掉以后系统可能发生的一大堆改变。如果针对接口编程,那么可以通过多态,它可以与任何新类实现该接口。但,当代码使用大量的具体时,就麻烦了,你要不断地修改代码。
比如说Pizza店类的点餐orderPizza()方法,首先,当然要确定是点哪种pizza
public class PizzaStore { Pizza orderPizza(String type){ Pizza pizza = null; if(type.equals("Cheese")){ pizza = new CheesePizza(); } else if(type.equals("Veggie")){ pizza = new VeggiePizza(); } pizza.prepare(); pizza.bake(); pizza.cut(); return pizza; } }
注意:pizza店肯定不止这两种pizza,所以需要修改代码。我们何不把他们放到一个工厂里面,让工厂帮我们生产pizza,这样pizza店就不用修改代码了。
public class PizzaStore { SimplePizzaFactory factory; public PizzaStore(SimplePizzaFactory factory) { this.factory = factory; } Pizza orderPizza(String type){ Pizza pizza = factory.createPizza(type); pizza.prepare(); pizza.bake(); pizza.cut(); return pizza; } } public class SimplePizzaFactory { public Pizza createPizza(String type){ Pizza pizza = null; if(type.equals("Cheese")){ pizza = new CheesePizza(); } else if(type.equals("Veggie")){ pizza = new VeggiePizza(); } return pizza; } }
简单工厂,但它不是一个设计模块式,反而比较像是一种编程习惯。但很多开发人员误认为它是“工厂模式”
要注意的是:Factory要在构造器中初始化。这里要能想到我们平常遇到的Java自带的类中也有类似的东西。比如说:我们在做Java Web开发的时候,经常要写ServiceImpl类(服务层)和DaoImpl类(即持久层),这里Service中就要用到Dao作为Factory。而Action把Service当做Factory。但这个实际上是抽象工厂方法,而不是工厂方法,后面会讲到两者的区别。
ps:MVC和三层框架的区别http://wenku.it168.com/d_000495306.shtml