中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > 设计模式
对《Java与模式》中工厂方法模式的异议
作者:未知 时间:2005-07-24 21:24 出处:JR 责编:chinaitpower
              摘要:对《Java与模式》中工厂方法模式的异议
 对《Java与模式》中工厂方法模式的异议  

 

关于工厂方法的一点讨论,我们知道工厂方法属于类型创建模式,而抽象工厂属于对象创建模式,并且所谓的类创建模式就是把创建工作延迟到子类,而对象创建模式则将延迟到另一个对象。 

  并且设计模式中指出,类模式处理类和子类子间的关系,这些关系通过继承建立,是静态的,在编译时刻便确定下来。对象模式则处理对象之间的关系,是动态的,运行时刻是可以变化的,更具动态性。 

  工厂方法由于属于类型创建模式,因此它的创建工作由子类完成,而不是使用对象进行创建,并且在《设计模式》中工厂方法的动机一节有一个示例,它的类大致如下: 

//抽象产品,可以是接口或者抽象类 
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来创建对象的,而不是使用继承,类模式来完成创建的。这与工厂方法的原意,类模式,把创建工厂延迟到子类实现,等有冲突。 

  这样想对象创建模式。 
 
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有