快速业务通道

对《Java与模式》中工厂方法模式的异议 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23

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

时间:2010-12-13

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

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

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

//抽象产品,可以是接口或者抽象类 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(); } }

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

时间:2010-12-13

大家可以看出,这其实使用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来创建对象的,而不是使用继承,类模式来完成创建的。这与工厂方法的原意,类模式,把创建工厂延迟到子类实现,等有冲突。

这样想对象创建模式。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号