在 GoF(Gang of Four) 的23种设计模式中,单件模式(Singleton)、简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造模式(Builder)、原型模式(Prototype)都归属于创建型模式。但其中最让容易让初学者混淆的就是抽象工厂模式和生成器模式。本文将通过一个实例来说明抽象工厂模式与建造都模式之间的区别及它们各自使用的场景。
假设我们想要创建一个窗体 Form,而且这个 Form 应该是支持多种主题的,Form 的基本组成部分是一个 Panel、三个按钮(最大化、最小化和关闭按钮),还有一个状态栏,
为了设计的简单和易于理解我们暂且将标题栏、标题栏图标、菜单栏和工具栏忽略,因为即使没有它们我们照样可以把这东西叫做窗体。我们现在要做的就是如何去创建两种不同主题的窗体,就把它定为蓝色 Xp 和新鲜出炉令人赏心悦目的 Vista 为例。当然它还必须支持“开-闭”原则(OCP),它样我们可以很容易的扩展更多主题。
第一步: 创建接口
创建出三个接口 IPanel,IButton(IButton再派生出三个子接口 IMaximizeBox、IMinimizeBox、ICloseBox 分别对应最大化、最小化、关闭按钮),IStatusBar,或许它们还应该同归属于 Controls ,但本文不考虑这些额外的东西。接着创建我们最终想要的产品接口 IForm 。
类图如下(点击可查看大图,下同):
接口仅仅是抽象的,为了得到产品的实例我们必须为它创建具体类型。
第二步:抽象工厂模式 (窗体零件制造厂)
下面将是抽象工厂登场亮相的时候了,抽象工厂的用意是向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。
在这里我们的抽象工厂类 FormFactory 将创建出一个个 XP 风格或 Vista 风格的窗体零部件,当然窗体除外,因为在这里窗体不属于零部分,它是最终的成品,它的创建工作是留给建造模式的。
下面是抽象工厂创建窗体零件的类图:
第三步:建造模式 (窗体组装厂)
在这里我们的客户 Client 已经可以通过工厂来创建出一个或者多个零件并添加到我们的窗体上了,事实上大多数的窗体都是由这些零部件组成,在这里我们仅利用建造模式搭建出一个最基本的窗体,它由一个 Panel、三个按钮(最大化、最小化和关闭按钮)和状态栏组成。
下面是通过建造模式组装一个窗体的类图:
这里的 FormBuilder 充当了上一图中的 Client 角色。现在我们就可以通过 FormBuilder 创建出一个 Xp 风格或者 Vista 风格的窗体了,由于设计模式都支持软件设计的第一原则 OCP ,所以我们也可以很方便地扩展出其它第三方主题出来,这时就可以让我们的用户尽情地发挥想象力了。
这里还想说明的是 FormDirector 类的 Construct 方法并非简单地去把 FormBuilder 中的 BuildX 方法顺序地执行一遍,我们可以只 BuildClosseBox 而不 BuildMaximizeBox 和 BuildMinimizeBox,这样我们就建造出了一个不能最大化和最小化的模式窗体的窗体,或者执行多次 BuildPanel 创建出一个多面板组成的窗体。
建造模式将产品的结构和产品的零件建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造者零件的责任分割开来,达到责任划分和封装的目的。
写到这里我们已经可以创建出一个想要的窗体了,主要是想通过这个例子说明抽象工厂模式和建造模式其实是责职和用意都相差得比较远的模式,而且它们也经常可以通过这种方式组合使用,达到互补。
下面简单概括一下这两种模式之间的相同和不同点。
相同点:
1、同属于创建型模式;
2、创建同属于几个产品族的对象的模式;
不同点:
1、抽象工厂模式注重的是对象的创建过程,这里的对象指的是零部件或者最终成品,毕竟有些对象自身就组成了我们想要的一个成型的产品;
2、建造模式注重的是产品建造最终的结果,这里的产品指的是成品,即用户最终希望得到的;
最后上一张完整图。于对模式的理解和善处于学习阶段,文中不免有不合理或错误的地方,欢迎批评指出。
参考资料:
《Java与模式》
《设计模式(中文版)》
C#面向对象设计模式纵横谈
分享到:
相关推荐
本主题将深入探讨四种关键的设计模式:抽象工厂模式、单例模式、工厂方法模式以及建造者模式,并结合.NET框架进行实际的代码实现。 1. 抽象工厂模式: 抽象工厂模式是一种创建型设计模式,它提供了一种创建对象族的...
这种方式使得客户端代码只需要与抽象工厂交互,而无需关心具体的产品实现细节。 工厂方法模式有以下几个关键角色: 1. 抽象工厂(Abstract Factory):这是工厂方法模式的接口,声明了创建产品的工厂方法。 2. 具体...
此外,作者可能还会讨论工厂模式与其他设计模式(如单例模式、建造者模式)的区别和配合使用。 标签中的“源码”可能意味着文章会包含实际的编程示例代码,帮助读者更好地理解工厂模式的工作原理。而“工具”可能是...
在本实验中,我们将探讨五种常见的创建型设计模式:简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式,并在Java环境中实现这些模式。 1. **简单工厂模式**: - **概念**:简单工厂模式通过一个...
在本节课后习题中,我们将探讨设计模式的两种实现:建造者模式和抽象工厂模式。我们将通过两个例子来演示这两种模式的应用。 建造者模式 建造者模式是一种创建型模式,它将产品的构建过程与其表示相分离,从而使得...
这个项目涵盖了四种重要的设计模式:单例模式、代理模式、建造者模式和抽象工厂模式,为初学者提供了一个良好的实践平台。 1. **单例模式**: 单例模式是一种确保一个类只有一个实例并提供全局访问点的设计模式。...
工厂模式分为简单工厂模式、工厂方法模式和抽象工厂模式,每种模式适用于不同级别的抽象和灵活性需求。 2. 单例模式: 单例模式是一种限制类实例化的模式,确保一个类只有一个实例,并提供全局访问点。这种模式在...
在本设计模式课程设计中,我们重点探讨了五个核心的设计模式:原型模式、单例模式、抽象工厂模式、代理模式和建造者模式。这些模式在Java编程中具有广泛的应用,能够帮助开发者创建更加灵活、可扩展和易于维护的代码...
在编程领域,设计模式是解决常见问题的经过验证的可重用解决方案,它们代表了软件设计的最佳实践。...在实践中,你可以结合这些模式与其他设计模式,如单例、建造者等,来构建更健壮、更易于维护的系统。
6. 工厂模式与其他设计模式的结合: 工厂模式可以和单例模式、建造者模式、策略模式等结合使用,以解决更复杂的设计问题。例如,工厂方法模式可以和单例模式结合,保证某个类只有一个实例,同时提供创建对象的接口。...
创建模式主要关注对象的创建过程,包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。单例模式确保一个类只有一个实例,并提供全局访问点;工厂方法模式定义一个用于创建对象的接口,但让子类决定...
本篇将深入探讨12种核心的设计模式,它们是:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式、适配器模式、装饰器模式、代理模式、桥接模式、组合模式、享元模式和观察者模式。 1. **单例模式**:确保一...
工厂模式有三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。在简单工厂模式中,一个静态方法根据输入参数来决定创建哪个类的实例。工厂方法模式则将创建对象的职责委托给子类,每个子类对应一个产品。抽象...
3. **使用建造者模式与其他模式的组合**:例如,结合模板方法模式,将不变的部分放到父类,可变的部分留给子类实现。 总结,建造者模式是一种强大的设计模式,它在处理复杂对象构建时提供了很大的灵活性。然而,...
- **抽象工厂模式**:当需要一组相关或相互依赖的对象时,抽象工厂模式能确保这些对象都属于同一族,并且提供了一种方法来获得这一族的所有相关对象。 - **单例模式**:保证一个类只有一个实例,并提供全局访问点...
创建型设计模式关注对象的创建过程,如单例模式(Singleton)、工厂模式(Factory)、抽象工厂模式(Abstract Factory)和建造者模式(Builder)。这些模式提供了一种灵活且可扩展的方式来创建和管理对象。 结构型...
在给定的代码示例中,提到了三种创建型设计模式:工厂方法(Factory Method)、抽象工厂(Abstract Factory)和建造者(Builder)。下面我们将详细探讨这些模式及其在实际开发中的应用。 首先,工厂方法模式是一种...
2. **创建型模式**:包括单例模式、工厂模式(简单工厂、工厂方法、抽象工厂)、建造者模式、原型模式等,它们关注于如何创建对象,减少类之间的耦合。 3. **结构型模式**:如适配器模式、装饰器模式、代理模式、...
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在Java中,如果需要在不同平台或者环境下创建一组相关的对象,抽象工厂模式就非常有用。例如,可以定义一个抽象工厂接口,为...
虽然不是严格意义上的创建型模式,但组合模式与创建型模式密切相关,因为它允许我们构建树形结构的对象。它将简单对象和组合对象以一致的方式处理,使客户端代码可以透明地操作单个元素或整个对象结构。 以上创建...