技术开发 频道

Factory Method属于类模式还是对象模式的疑惑及解惑


IT168技术文档】 
    在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便需要创建Document对象的实例,然而要创建的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来创建的,这正好比较符合对象创建型模式的特征“而一个对象创建型模式将它延迟到另一个对象中”。 

    通过分析总结就是:如果创建的对象是自己用,那就看作类创建型模式理解较好;如果创建的对象是提供给外界对象用,那就看作对象创建型模式理解较好。 
    以上是我的理解,欢迎交流
0
相关文章