`
lxz891117
  • 浏览: 33386 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

抽象工厂模式与开闭原则

 
阅读更多

http://blog.csdn.net/lovelion/article/details/9319571


5“开闭原则”的倾斜性

Sunny公司使用抽象工厂模式设计了界面皮肤库,该皮肤库可以较为方便地增加新的皮肤,但是现在遇到一个非常严重的问题:由于设计时考虑不全面,忘记为单选按钮(RadioButton)提供不同皮肤的风格化显示,导致无论选择哪种皮肤,单选按钮都显得那么“格格不入”。Sunny公司的设计人员决定向系统中增加单选按钮,但是发现原有系统居然不能够在符合“开闭原则”的前提下增加新的组件,原因是抽象工厂SkinFactory中根本没有提供创建单选按钮的方法,如果需要增加单选按钮,首先需要修改抽象工厂接口SkinFactory,在其中新增声明创建单选按钮的方法,然后逐个修改具体工厂类,增加相应方法以实现在不同的皮肤中创建单选按钮,此外还需要修改客户端,否则单选按钮无法应用于现有系统。

怎么办?答案是抽象工厂模式无法解决该问题,这也是抽象工厂模式最大的缺点。在抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构很麻烦,抽象工厂模式的这种性质称为“开闭原则”的倾斜性。“开闭原则”要求系统对扩展开放,对修改封闭,通过扩展达到增强其功能的目的,对于涉及到多个产品族与多个产品等级结构的系统,其功能增强包括两方面:

(1)增加产品族:对于增加新的产品族,抽象工厂模式很好地支持了“开闭原则”,只需要增加具体产品并对应增加一个新的具体工厂,对已有代码无须做任何修改。

(2)增加新的产品等级结构:对于增加新的产品等级结构,需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品的方法,违背了“开闭原则”。

正因为抽象工厂模式存在“开闭原则”的倾斜性,它以一种倾斜的方式来满足“开闭原则”,为增加新产品族提供方便,但不能为增加新产品结构提供这样的方便,因此要求设计人员在设计之初就能够全面考虑,不会在设计完成之后向系统中增加新的产品等级结构,也不会删除已有的产品等级结构,否则将会导致系统出现较大的修改,为后续维护工作带来诸多麻烦。

6 抽象工厂模式总结

抽象工厂模式是工厂方法模式的进一步延伸,由于它提供了功能更为强大的工厂类并且具备较好的可扩展性,在软件开发中得以广泛应用,尤其是在一些框架和API类库的设计中,例如在Java语言的AWT(抽象窗口工具包)中就使用了抽象工厂模式,它使用抽象工厂模式来实现在不同的操作系统中应用程序呈现与所在操作系统一致的外观界面。抽象工厂模式也是在软件开发中最常用的设计模式之一。

1.主要优点

抽象工厂模式的主要优点如下:

(1)抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

(2)当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。

(3)增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。

2.主要缺点

抽象工厂模式的主要缺点如下:

增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。

3.适用场景

在以下情况下可以考虑使用抽象工厂模式:

(1)一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是很重要的,用户无须关心对象的创建过程,将对象的创建和使用解耦。

(2)系统中有多于一个的产品族,而每次只使用其中某一产品族。可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。

(3)属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。同一个产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束,如同一操作系统下的按钮和文本框,按钮与文本框之间没有直接关系,但它们都是属于某一操作系统的,此时具有一个共同的约束条件:操作系统的类型。

(4)产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。


分享到:
评论

相关推荐

    工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式

    工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式** 简单工厂模式是最简单的工厂模式实现,它提供一个静态方法或者类来创建对象,这个类通常被称为“工厂”。用户只需要...

    设计模式-抽象工厂模式(讲解及其实现代码)

    - 当添加新的产品等级结构时,需要修改现有的工厂类,违背了开闭原则。 在实际项目中,例如在开发跨平台的应用程序时,如操作系统、数据库等,不同平台可能需要使用不同的组件,抽象工厂模式就非常适用。通过创建...

    设计模式-抽象工厂模式

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“族”,即一系列相关的对象。在抽象工厂模式中,我们创建一个抽象工厂接口,然后为每一种具体...

    简单工厂模式、工厂模式、抽象工厂模式案例(C++实现)

    工厂方法模式的优势在于增加了灵活性,当需要添加新产品时,只需新增一个工厂类,而无需改动现有代码,符合开闭原则。同时,它也使得系统与具体的产品实现解耦。 3. 抽象工厂模式: 抽象工厂模式是工厂方法模式的...

    C#抽象工厂模式案例代码

    抽象工厂模式是一种面向对象的设计模式,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在C#中,这种模式经常用于软件工程中的框架设计,允许系统独立于具体产品的实现进行扩展和修改。...

    抽象工厂模式Demo

    这样,即使在运行时更换了工厂,客户端代码也不需要修改,符合开闭原则。 在"MyFactory0.3"这个文件中,我们可以推测它可能包含了实现上述组件的源代码文件。可能包括`IFactory.java`(抽象工厂接口)、`...

    c++ java 抽象工厂模式代码

    抽象工厂模式是一种设计模式,属于创建型模式,它提供了一个创建对象族的接口,而无需指定它们的具体类。这种模式让我们能够将产品族的创建过程延迟到子类中,使得子类可以在不修改原有代码的情况下增加新的产品。在...

    抽象工厂模式案例代码

    - 如果需要添加新的产品类型,可能需要修改现有的工厂类,这违反了开闭原则。 - 若产品族之间的依赖关系过于复杂,可能导致抽象工厂接口变得庞大且难以管理。 总之,抽象工厂模式是软件设计中一个重要的工具,尤其...

    Java工厂模式:简单工厂、工厂方法模式、抽象工厂模式代码示例

    在Java中,工厂模式分为三种:简单工厂、工厂方法模式和抽象工厂模式。 **简单工厂模式** 是最基本的工厂模式,它由一个工厂类根据传入的参数决定创建哪一种产品类的实例。简单工厂容易实现,但违反开闭原则,即...

    简单工厂-工厂方法-抽象工厂 对比总结

    抽象工厂模式可以保证在任何环境下都能正确地创建对象,提高了代码的可移植性,但其缺点是增加新平台时,需要增加新的抽象工厂和一系列具体工厂,这可能会导致系统结构变得复杂。 对比这三种工厂模式: 1. **简单...

    设计模式——抽象工厂模式

    2. **扩展性**:添加新的产品族时,只需添加新的具体工厂,无需修改已有代码,符合开闭原则。 3. **灵活性**:在运行时,可以根据条件选择不同的工厂来创建产品,适应性强。 然而,抽象工厂模式也有一些局限性: - ...

    走进设计模式之抽象工厂(Abstract Factory)

    此外,如果需要添加新的产品等级结构,可能需要修改现有的工厂类,违背了开闭原则。 6. **与其他设计模式的比较**:可能会对比抽象工厂模式与单例模式、工厂方法模式等其他创建型模式,解释它们之间的区别和适用...

    抽象工厂设计模式简单实例

    2. 如果产品族中对象的接口变化,可能需要修改抽象工厂和所有具体工厂,违反了“开闭原则”。 在实际开发中,抽象工厂模式常用于框架设计和跨平台应用,例如数据库连接库、GUI组件库等,其中每个平台都有自己的实现...

    设计模式中抽象工厂模式的一个例子

    2. 强耦合:当新产品需要添加或者原有产品发生改变时,可能需要修改抽象工厂的接口,这违背了开闭原则。 在实践中,我们可以结合其他设计模式,如工厂方法、单例模式等,以优化抽象工厂模式的实现。例如,我们可以...

    设计模式系列之抽象工厂模式

    抽象工厂模式是软件设计模式中的一种,属于创建型模式,它提供了一种创建对象组族的接口,使得相同族的接口在不同的实现中可以产生不同的子类对象。这种模式允许客户端独立于产品族进行编程,而产品族可以独立地扩展...

    简单工厂模式,工厂方法模式,抽象工厂模式

    本文将深入探讨三种工厂模式:简单工厂模式、工厂方法模式以及抽象工厂模式,并结合源码分析其应用场景和优缺点。 1. 简单工厂模式 简单工厂模式(Simple Factory Pattern)是一种静态工厂方法,它通过一个公共的...

    设计模式实现——抽象工厂模式结构实现

    抽象工厂模式是设计模式中的一种创建型模式...通过这种方式,我们可以轻松地添加新的平台或产品,而不需要修改现有代码,符合开闭原则。此外,抽象工厂模式还提高了代码的可扩展性和可维护性,降低了系统之间的耦合度。

    java抽象工厂模式实现

    学习这个模式可以帮助开发者更好地理解和应用设计原则,如单一职责原则(SRP)、开闭原则(OCP)以及接口隔离原则(ISP),同时也能提高代码的可维护性和可扩展性。在实际项目中,抽象工厂模式常用于框架设计、插件...

    格斗类游戏软件——抽象工厂模式

    这样,当需要添加新的难度级别或敌人类型时,我们只需要添加新的具体工厂类,而无需修改已有的代码,这遵循了开闭原则。 在举例中,我们看到抽象工厂模式用于创建鞋子、西装和衬衫等产品。每个产品都有男性和女性两...

Global site tag (gtag.js) - Google Analytics