• 六个创建模式之抽象工厂模式(Abstract Factory Pattern)


    问题:
    使用工厂方法模式的主要问题是工厂类过多,每个产品对应一个工厂,不利于维护。因此可以考虑使用一个工厂创建一个产品族。

    定义:
    提供创建一些列相关或相互依赖的对象实例的接口,这些类可以称为一个产品家族。

    结构图:

    • AbstractProduct:抽象产品类,抽象工厂模式中至少含有一个抽象产品类,每个抽象产品类派生出一个产品结构,定义了该产品结构中所有派生类的公开方法,方便于该产品的扩展。
    • ConcreteProduct:具体产品类,抽象工厂模式中含有多种具体产品类,实现其对应的抽象产品类定义的方法。
    • Factory:抽象工厂类,声明了一组用于创建一个产品家族的方法。
    • ConcreteFactory:具体工厂类,每个工厂不在仅仅创建一个产品,而是由抽象工厂类定义的创建多个产品。

    产品等级结构与产品族

    • 产品等级结构即是产品的继承结构,具体产品类都派生自抽象产品类,抽象产品类在顶层。
    • 产品族是由一个工厂生产的,位于不同产品等级结构的一组产品。

    注意:

    • 工厂方法可以看做特殊情况下的抽象工厂,即只含有一个产品结构,每个产品族只有一个产品。
    • 抽象工厂模式的“开闭原则”具有倾斜性。对于加入一个产品族,是十分方便的,仅需要添加对应的具体产品类和一个具体具体工厂列。但是对于加入一个产品结构,则需要修改所有的工厂类,无法方便扩展。

    优点:

    • 隔离了类的具体实现,并隐藏了一个产品家族中产品的关联关系。如果要更换一个产品家族,只要更换到对应的具体工厂上。
    • 当一个产品家族被设计成一起工作时,对应的工厂类可以做保证。
    • 增加一个新的产品族十分方便,无需修改已有系统源码,符合“开闭原则”。

    缺点:

    • 无法增加新的产品等级结构,需要对原有代码进行较大的修改,甚至修改抽象层代码。

    适用场景:

    • 产品类型较多且与其它产品有一定的组合或关联关系,但用户无需关心对象创建过程。
    • 系统中有多个产品族,且每次只使用一个产品族,可以通过配置文件等方式使用户可以动态地改变产品族。
    • 产品等级结构稳定,在设计完成后不会出现新增产品等级结构的情况。

    实例:

    AbstractFactoryPattern.java

  • 相关阅读:
    Microsoft Visual Studio 2008
    JavaScript动态添加|绑定事件
    超级实的js代码大全 [转]
    《dojo 边学边用》(02), djConfig配置解说
    整合ckeditor_3.0.1和ckfinder_aspnet_1.4.1.1,配置随笔记录
    everybody is a tourist。you and me。
    测试并提升你的jQuery选择器水平
    php
    《dojo 边学边用》(01), 初识dojo,dojo简介和框架概览
    HTML 三栏自动适应
  • 原文地址:https://www.cnblogs.com/zhangfei614/p/5994570.html
Copyright © 2020-2023  润新知