龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

对《Java与模式》中工厂方法模式的异议

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
关于工厂方法的一点讨论,我们知道工厂方法属于类型创建模式,而抽象工厂属于对象创建模式,并且所谓的类创建模式就是把创建工作延迟到子类,而对象创建模式则将延迟到另一个

  关于工厂方法的一点讨论,我们知道工厂方法属于类型创建模式,而抽象工厂属于对象创建模式,并且所谓的类创建模式就是把创建工作延迟到子类,而对象创建模式则将延迟到另一个对象。
  
  并且设计模式中指出,类模式处理类和子类子间的关系,这些关系通过继续建立,是静态的,在编译时刻便确定下来。对象模式则处理对象之间的关系,是动态的,运行时刻是可以变化的,更具动态性。
  
  工厂方法由于属于类型创建模式,因此它的创建工作由子类完成,而不是使用对象进行创建,并且在《设计模式》中工厂方法的动机一节有一个示例,它的类大致如下:
  
   //抽象产品,可以是接口或者抽象类
  public abstract class document {
  public void open(){
  ...............
  ...............
  }
  public void close(){
  ...............
  ...............
  }
  public void save();
  }
  //具体的产品,
  public class Mydocument extends document{
  public void open(){
  .............
  ..............
  }

  ...............

  }
  我们工厂方法
  public abstract class appliaction {
  //该方法是工厂方法,由子类实现
  public abstract document createDocument();

  //模板方法,在方法中使用了工厂方法
  
  pubic void newDocument(){
  
  //使用工厂方法,获得doc,而实际有子类完成,//这里可以看出,对象的创建,是通过继续来实现,是静态的,编译时已经确定//而不是通过对象的委托来实现,故属于类创建型模式
  Document doc=createDocument();
  doc.open();
  ....................
  doc.save();
  }
  }

  具体的工厂实现由子类来实现工厂方法:
  

public class myappliaction extends appliaction {
  public document createDocument(){
  return new Mydocument();
  }
  }

  大家可以看出,这其实使用template method模式,抽象方法声明创建对象,而模板方法完成业务逻辑,她使用抽象创建方法,由继续来获得产品,而不是使用对象来创建对象的。

  并且大家仔细看<设计模式>71页的结构图,里的creator里有两个方法,其中一个使用factorymethod方法,另外一个就是普通的方法,anOperation它调用了工厂方法,prodUCt=factorymethod()来获得产品对象。

  现在问题就出现在这里,而另外一本书阎宏的《Java与模式》的167地结构图中却没有把这点作出标记,并且提供的示例,也不像最初<设计模式>中的工厂方法的例子,
  他的示例如下:

  //抽象工厂,而这里却没有方法使用工厂方法:
  public interface Creator{
  /**
  * 工厂方法
  */
  public Product factory();
  }

  public class ConcreteCreator1 implements Creator
  {
  /**
  * 工厂方法
  */
  public Product factory()
  {
  return new ConcreteProduct1();
  }
  }

  而客户端却使用;
  public static void main(String[] args){
  creator1 = new ConcreteCreator1();
  prod1 = creator1.factory();
  }

  我感觉这样示例有问题,或者不妥,或者不能表达原意。
  
  在客户端,他的对象创建使用了
  
  prod1 = creator1.factory();
  
  这样显然使用对象creator1来创建对象的,而不是使用继续,类模式来完成创建的。这与工厂方法的原意,类模式,把创建工厂延迟到子类实现,等有冲突。
  
  这样想对象创建模式。


  
精彩图集

赞助商链接