在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来创建的,这正好比较符合对象创建型模式的特征“而一个对象创建型模式将它延迟到另一个对象中”。
通过分析总结就是:如果创建的对象是自己用,那就看作类创建型模式理解较好;如果创建的对象是提供给外界对象用,那就看作对象创建型模式理解较好。
以上是我的理解,欢迎交流
分享到:
相关推荐
Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。
Factory Method(工厂方法)模式是GoF(Gang of Four)设计模式之一,属于创建型模式。此模式的核心在于提供了一种创建对象的方式,而不必将具体的类名硬编码到程序中,从而增强了程序的灵活性和可维护性。 #### ...
C#面向对象设计模式纵横谈(5):Factory Method 工厂方法模式(创建型模式) (Level 300)
工厂方法模式是面向对象设计模式中的行为型模式之一,它提供了一种...在提供的文件列表中,“FactoryMethod”可能是包含这个简单示例代码的文件。如果有机会查看这个文件,将能更深入地理解工厂方法模式的实现细节。
工厂方法模式是面向对象设计模式中的一个核心模式,属于创建型模式。它的主要目的是通过引入一个工厂接口,将具体的对象创建过程封装起来,使得客户端在使用时无须关心产品类的确切实现,只需要通过工厂来获取所需的...
今天我们要探讨的是设计模式中的一个经典成员——工厂方法模式(Factory Method Pattern)。工厂方法模式是创建型设计模式的一种,它提供了一种创建对象的最佳方式。 ### 一、什么是工厂方法模式? 工厂方法模式...
"工厂方法"(Factory Method)是这些设计模式之一,属于创建型模式,它在C#编程中扮演着至关重要的角色。本教程由张建中教授,旨在深入解析C#中的工厂方法设计模式。 工厂方法模式是一种抽象工厂模式的变体,主要...
3. **工厂接口(Factory Method)**:定义创建产品对象的接口,通常是一个抽象类,包含一个或多个工厂方法,用于返回产品对象。 4. **具体工厂(Concrete Factory)**:实现了工厂接口,提供了创建具体产品对象的...
Factory Method 工厂方法模式(创建型模式).wmv
工厂方法模式(Factory Method Pattern)是设计模式中的创建型模式之一,主要解决对象创建过程中的复杂性问题。在软件工程中,当一个类不知道它所必须创建的对象的类的时候,它就不会实例化对象,而是使用一个工厂...
Factory Method设计模式C#中的实现例子
工厂方法(Factory Method)设计模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,一个类的实例化延迟到了子类,这样做的好处是每个子类可以决定实例化哪一个类。这种类型的设计模式...
"t02FactoryMethod" 指的是工厂方法(Factory Method)设计模式,它是面向对象设计中的一种经典模式。这个模式主要关注于如何创建对象,通过引入一个工厂接口或者抽象类,将对象的创建过程封装起来,使得具体的对象...
C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method) C++的设计模式之工厂方法模式(Factory Method)
《设计模式之——工厂方法(Factory Method)》 在软件工程中,设计模式是一种解决常见问题的可重用解决方案,它被广泛应用于构建高质量、可维护的代码。工厂方法是面向对象设计模式的一种,属于创建型模式。这个...
工厂方法(Factory Method)是面向对象设计模式中的一个基础且广泛应用的模式,它属于创建型模式,主要目的是为了解耦对象的创建过程。本文将深入探讨工厂方法的设计理念、实现方式及其在实际开发中的应用。 ### ...
Factory模式的核心思想是提供一个接口或者抽象类,用于创建某一类对象,但允许其子类决定实例化哪一个类。这种模式使得创建过程与使用过程解耦,提高了代码的灵活性和可扩展性。Factory模式通常分为简单工厂(Simple...