读书人

Factory Method属于种模式还是对象模式

发布时间: 2012-11-05 09:35:12 作者: rapoo

Factory Method属于类模式还是对象模式的疑惑及解惑
在GOF《设计模式-可复用面向对象软件的基础》3.3节Factory Method的标题中(Factory Method工厂方法——对象创建型模式),将该模式的类型指定为“对象创建型模式”,在学习的过程中总感觉有些疑惑,因为在意识中我觉得应该属于“类创建型模式”才对。下面是对这一疑惑的陈述和最后解惑。?疑惑为什么我觉Factory Method是类创建型模式第一、类创建型模式和对象创建型模式的核心区别为:“类创建型模式将对象的部分创建工作延迟到子类中,而一个对象创建型模式将它延迟到另一个对象中”(设计模式引言1.5节),而Factory Method 模式的意图为“定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类”,这正好与类创建型模式相吻合;第二、我们可以通过Template Method(模板方法-类行为型模式)来进一步说明,Template Method定义了一个操作中算法的骨架,而将一些步骤延迟到子类中,从而使得子类可以不改变算法的结构既可重定义该算法的某些特定步骤。这与Factory Method的意图(定义一个用于创建对象的接口,而让子类来决定实例化哪一个类,从而使一个类的实例化延迟到子类,给子类带来了灵活性)从层次的角度来说正好相同,而不同的只是Template Method 延迟的是操作行为,Factory Method 延迟的是实例化对象。?再疑惑后来在该书第一章引言的模式组织编目中,发现确实是把Factory Method归入了类创建型模式,这不由得又怀疑难道是3.3节的标头中模式类型出现的印刷错误……?疑惑释去随着对设计模式理解的逐渐深入,发现其实将某个模式分为对象模式还是类模式,并不是能够很严格和清晰的,具体分类根据观察的角度不同会出现不同的结果。对于Factory Method模式,随着其使用场景的不同,其所属的类型也不大相同(如果非要给个分类的话),下面分别用两个应用场景来描述和理解。?应用场景一:(该模式动机中所举示例)一个文档应用框架,在该框架中有两个主要的抽象类Application和Document,对于一些操作发生时,比如创建新文档或打开文档时,Application便需要创—ocument对象的实例,然而要创建的Document对象是与特定应用相关的,作为框架抽象类的Application无从知晓,所以这个时候通过引入Factory Method模式来解决这个尴尬的局面,Factory Method将创建对象的操作分离出来用一个接口来定义,子类可以重新实现该接口从而创建特定于应用的正确对象。在该场景中,通过类创建型模式来理解Factory Method要好一些,通过Factory Method,父类为子类提供了一个挂钩,通过该挂钩子类可以具体实现或扩展父类的对象创建接口。?应用场景二:(该模式效果部分示例)可以被交互操作的图形应用,在该应用中图形的操作从图形对象(Figure)中分离出来,封装成独立的Manipulator对象,Manipulator负责对图形的操作及保存操作过程中图形的相应状态,在这里图形(Figure)通过Factory Method创建和自己匹配的Manipulator对象。在该场景中,通过对象创建型模式来理解Factory Method要好一些,因为在这里Factory Method所创建的对象Manipulator不为图形Figure自己使用,而是提供给客户端Client,这样Client所使用的对象Manipulator,是通过另一对象Figure来创建的,这正好比较符合对象创建型模式的特征“而一个对象创建型模式将它延迟到另一个对象中”。???????? 通过分析总结就是:如果创建的对象是自己用,那就看作类创建型模式理解较好;如果创建的对象是提供给外界对象用,那就看作对象创建型模式理解较好。??????? 以上是我的理解,欢迎交流

场景应用二:Figure图形处理应用下的结构图


场景应用一:jdk集合迭代器的结构图
8 楼 geradle 2006-12-07 我还是没有任何新的想法。
首先我要阐明几点,我不是用Abstract Factory来表达对象模式,而是该模式符合对象模式的特点。
我的观点是你举的那个Figure and manipulator的例子中,Factory Method这个Pattern是运用于 AbstractFigure and AbstractManipulator两个类上。我认为当你设计出了这两个类,那么该设计场景应该已经完成。所有Factory Method与你的client无关。如果你client需要使用concrete figure and manipulator你需要通过继承来产生新的类。
BTW:我对Decorator模式的理解也与你不一致。不知道你上图的Decorator模式用于装饰哪个类。 9 楼 qinysong 2006-12-07 我上面所指的Decorator,不是为了引入Decorator模式,只是为了增加一个和Manipulator平行的兄弟类,比如这个类可以为Figure添加颜色,修饰边框等等,这样Figure就可以把创建这些对象的工作移到抽象工厂中,但是当这种平行的兄弟类型比较少时,比如只有一个Manipulator,所以可以合并到Figure类中以简化设计。 10 楼 qinysong 2006-12-07 其实我们的理解可能都没有什么错误,我只是表达对于Gof《设计模式》中3.3节将标题列为Factory Method —— 对象创建型模式 的自己的理解和看法,如果对这一标题你有更明晰的看法,可能就是我们这个帖子最好的收尾 11 楼 lansha129 2007-07-21 哥几个,有没有GOF的设计模式的中文版电子书啊,给我发一个,谢谢
lansha129@126.com

读书人网 >软件架构设计

热点推荐