首页 > 技术文章 > 工厂模型——简单工厂和工厂方法

wmm3416 2013-09-26 16:25 原文

书上举的例子是关于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

 

 
其次,我们再想一个问题。现在有人想加盟PizzaStore,怎么办??
现在我们将factory虚拟化,没有真正的factory类,但是createPizza()方法正是工厂方法,用来制造产品。
让我们来认识一下工厂方法模型
(1)创建者类
PizzaStore类为抽象创建者类
(2)产品类
Pizza类以及它的子类
工厂方法模式
定义了一个创建对象的接口,但由子类来决定来实例化哪个类。工厂方法让类把实例化推迟到子类。
这里希望不要误解,所谓的“决定”并不是模式允许子类本身在运行时决定,而是指在编写创建类时,不需要知道实际创建的产品是哪一个,选择了使用哪个子类,自然就决定了实际创建了什么。
 

推荐阅读