一.引子
GOF的23个模式中与Factory相关的有两个,一个是Factory Method,另一个是Abstract Factory模式。还有一个是Simple Factory,是深入浅出设计模式这本书定义的。这里面没有Factory这个模式,很多人都没有注意到这一点(包括idior,谁让你有名呢:)。
*如果您对创建型模式特别是Factory Method,Abstract Factory和Simple Factory还没有初步了解,建议你先看看博客园设计模式团队相关的文章。
二.讨论
提出这一点来绝对不是哗众取宠,关键是这个“Method”很重要。我们先来看看GOF的书中关于Factory Method的类图结构:
Idior说很多人没有注意到AnOperation这个方法,也许是这样的,但是这个方法并不重要。工厂方法的意图一节中指出:工厂方法定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。其别名是虚拟构造器。从其意图和别名中都看不出AnOperation这个方法。当然为了说明这个方法不重要,我还必须给出一个例子:该例子使用了Factory Method模式,而又不存在AnOperation方法。有吗?有,就是Abstract Factory模式。
《DP》中在说到Abstract Factory模式的实现的时候,指出AbstractFactory仅声明一个创建产品的接口,真正创建产品是由ConcreteProduct子类实现的。最通常的办法是为每一个产品定义一个工厂方法(参见Factory Method(3.3))。一个具体的工厂将为每个产品重定义该工厂方法以指定产品。从这里我们可以看出来:Factory Method和Abstract Factory不是一个层次上的模式。前者是实现后者的一些有用技术之一。(《DP》中的说法是:Here are some useful techniques for implementing the Abstract Factory pattern.)GOF也多次强调,自己给出的类图只是一个例子,一种实现(我找到原话再贴过来:)。所以我们不应该拘泥于《DP》中的类图。
在新手中,一个常见的误解是Factory Method应该有一个独立的Factory类。这是新手才会犯的错误,Factory Method,只是一个Method而已。任何时候,当你存在一个虚拟的(抽象的)函数其返回值是一个接口(抽象类),你就在使用Factory Method了。我们不关心谁调用这个方法,这个方法的参数如何。理解一个模式的简单性往往比理解其复杂性更重要。
那么Factory Method是不是可以有一个独立的Factory类与其对应呢?当然可以,而且恭喜你,如果你的独立的Factory类中包含几个Factory Method,你已经在使用Abstract Factory了。注意不要跟Simple Factory模式弄混,Simple Factory虽然也包含创建对象的方法,但是并没有使用Factory Method模式。
我们再来看看Abstract Factory的类图:
在这个类图中CreateProductA()和CreateProductB()都是Factory Method(而没有出现AnOperation()这样的方法)。
三.结论:
虽然这篇随笔已经很短了,我仍然愿意总结一下前面所说的话,以节省您的时间:)
1. 没有Factory这个模式,大多数人提到Factory模式的时候,实际上指的是Factory Method。
2. Factory Method模式不要求一个独立的工厂类,该模式的核心是一个虚拟的(抽象的)方法,该方法返回一个产品的接口。
3. Factory Method和Abstract Factory不是一个层次上的模式,前者是后者赖以实现的一项技术,后者可以从前者演化而来。关于演化过程请参考idior的这篇文章。
四.并非闲话
不记得是idior,TerryLee或者吕兄中的哪一位提出的“纯”的设计模式这个说法,指的是最简单的而符合某个模式的定义的实现。我们见到的设计模式的实现往往是或与其他模式混合使用,或者对具体应用做了妥协,使得我们看不到“纯”的设计模式,也就看不到模式的简单性。而理解模式的简单性对于我们认识模式的实质是非常重要的,就像是在化学里面分析原子的特性一样。
五.何谓Factory(From《重构与模式》)
Factory一词是业内滥用最厉害和最不精确的术语之一。有些人使用“Factory模式”一词指代Factory Method[DP]模式,有些人使用这个术语表示Abstract Factory[DP]模式,有些人使用这个术语表示这两个模式,而有些人则使用这个词表示任何创建对象的代码。
......
下图中使用粗线表示创建对象的方法,说明了Factory Method,Factory(书中所指的Factory,笔者注)和Abstract Factory结构之间的区别。
分享到:
相关推荐
Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。
Factory模式的核心思想是提供一个接口或者抽象类,用于创建某一类对象,但允许其子类决定实例化哪一个类。这种模式使得创建过程与使用过程解耦,提高了代码的灵活性和可扩展性。Factory模式通常分为简单工厂(Simple...
在这个模式中,我们创建一个用于创建对象的接口,但让子类决定实例化哪一个类。Factory方法让类的实例化延迟到子类进行,使得代码更加灵活,同时也封装了可能存在的复杂对象创建过程。 在C++中,Factory模式通常...
在工厂模式中,当客户端请求创建一个产品对象时,它不会直接创建,而是调用一个专门的工厂对象来完成这个任务。这样做的好处是解耦了客户端代码与具体实现之间的关系,使得系统更具有灵活性和可扩展性。 在Java中,...
Factory模式,也称为工厂模式,是软件工程中常用的设计模式之一,主要用来解决对象创建时的灵活性和可扩展性问题。在C++中,工厂模式是实现抽象工厂接口的类,用于生成特定类型的对象,而不需要暴露创建逻辑,同时...
其中,Abstract Factory模式是23种GoF(Gang of Four)设计模式之一,它提供了一种创建一组相关或相互依赖对象的接口,而无需指定它们具体的类。 #### Abstract Factory模式的核心概念 Abstract Factory模式的核心...
工厂方法模式是面向对象设计模式中的行为型模式之一,它提供了一种创建对象的最佳方式。在工厂方法模式中,一个工厂类负责创建对象,而具体的创建过程被延迟到了子类中,使得子类可以在不修改原有代码的基础上决定...
在设计模式中,Abstract Factory模式是一种用来解决在不指定具体实现的情况下创建一系列相关或相互依赖对象的模式。在本文的上下文中,我们看到它被应用于一个奇幻RPG游戏的角色种族设计,每个种族(如人类、精灵)...
设计模式-Singleton与Factory
在Factory模式中,一个工厂类负责创建对象,而客户端代码使用这个工厂而不是直接实例化对象。 1. **简单工厂**:工厂类根据传入的参数或条件决定创建哪种类型的实例。 2. **工厂方法**:定义一个创建对象的接口,让...
这个模式通过创建一个新类(外观类),将子系统中的一系列接口聚合到一起,客户端只需要与这个单一的外观类打交道,而无需了解子系统的内部工作细节。这提升了代码的可读性和可维护性,同时也增强了系统的可扩展性,...
Factory Method(工厂方法)模式是GoF(Gang of Four)设计模式之一,属于创建型模式。此模式的核心在于提供了一种创建对象的方式,而不必将具体的类名硬编码到程序中,从而增强了程序的灵活性和可维护性。 #### ...
1. 抽象工厂(Abstract Factory):这是模式的核心,它是一个接口或抽象类,定义了一系列创建对象的方法,但并不直接实例化具体的对象。这些方法用于创建一系列相关或相互依赖的对象。 2. 具体工厂(Concrete ...
1. 抽象工厂(Abstract Factory):这是模式的核心,定义了一组创建对象的接口,客户端通过这个接口请求创建所需的产品。这个接口不直接创建产品,而是将产品创建的职责委托给具体工厂。 2. 具体工厂(Concrete ...
为了应对这种变化我们抽象出它比较稳定的接口,隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变,这就是我们经常谈的Factory模式了。 详细见博客 ...
1. 简单工厂模式:这是最简单的工厂模式形式,它包含一个工厂类,负责创建对象。这个工厂类通常有一个静态方法,根据传入的参数来决定创建哪种类型的实例。 2. 工厂方法模式:在工厂方法模式中,每个子类都有一个...
创建型模式(Creational Pattern) 是对类的实例化过程的抽象化。一些系统在创建对象时,需要动态地决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象。创建型模式描述了怎样构造和封装这些动态的决定...
1. 抽象工厂(Abstract Factory):这是工厂方法模式的核心接口,它声明了一组用于创建产品的公共方法。抽象工厂通常为抽象类或接口。 2. 具体工厂(Concrete Factory):实现了抽象工厂接口,提供具体的产品实例。...
这个模式主要用于创建一系列相关的对象,而无需指定它们的具体类。在本文中,我们将深入探讨抽象工厂模式的概念、工作原理以及在C++中的实现。 **1. 模式定义** 抽象工厂模式是一种提供创建一系列相关或相互依赖...