博客
关于我
[设计模式] 创建模式之抽象工厂模式
阅读量:772 次
发布时间:2019-03-24

本文共 3369 字,大约阅读时间需要 11 分钟。

抽象工厂模式:生产零件系列的智能化工厂

在软件架构中,抽象工厂模式是一个强大的工具,适用于处理复杂的依赖关系和对象创建问题。它通过提供统一的工厂接口,动态创建不同产品线,解决了传统工厂模式的多工厂模式和简单工厂模式的局限性。

定义与作用

意图: 提供一个统一的工厂接口,动态创建一系列相关或相互依赖的对象,而无需显式指定具体的实现类。

主要解决的问题:

在传统多工厂模式中,客户端需要明确指定工厂类型,例如:

Object createshape(ShapeType shape) {    if (shape == SHAPE_RECTANGLE) {        return new Rectangle();    } else if (shape == SHAPE_SQUARE) {        return new Square();    } else {        return null;    }}``这种方式丧失了灵活性,且工厂逻辑分布在客户端,难以扩展和维护。**何时使用:**系统需要生产多个相关产品,但消费者只使用其中一族产品时。例如,制造手机外壳的不同型号(如oppo、vivo等),但消费者只能选择一种类型。**如何解决:** 在一个工厂接口中定义多个产品,同时允许消费者通过工厂获取所需产品。### 核心思想抽象工厂的核心思想是:将一系列相关产品的创建流程集中,消费者只需要通过工厂调用必要的方法,系统自动完成相关产品的创建和配置。### 技术实现中的关键点1. **工厂接口设计**:工厂接口必须包含一系列针对单个产品的方法,以及一个创建所有相关产品的方法。例如:```cppclass Factory {public:    virtual Shape* Createshape(ShapeType type) = 0;    virtual Color* Fillcolor(ColorType type) = 0;};
  1. 具体工厂实现:实现工厂接口的具体工厂类,实现在接口定义中未明确的部分。例如:
  2. class ContrateFactory : public Factory {public:    Shape* Createshape(ShapeType type) {        if (type == ShapeType::rectangle) {            return new Rectangle();        } else if (type == ShapeType::square) {            return new Square();        } else {            return nullptr;        }    }    Color* Fillcolor(ColorType type) {        if (type == ColorType::red) {            return new Red();        } else if (type == ColorType::green) {            return new Green();        } else {            return nullptr;        }    }};
    1. 工厂使用示例:通过工厂获取所需产品的方式简单易懂,例如:
    2. void Test2() {    ContrateFactory cf;    Shape* s = cf.Createshape(ShapeType::square);    Color* c = cf.Fillcolor(ColorType::red);    s->draw();    c->fill();}

      与其他工厂模式的区别

      • 简单工厂模式:简单工厂模式在创建单一对象时更为直接,但扩展性差,且工厂逻辑集中在调用者端。

      • 多工厂模式:在创建不同类型对象时需要频繁地判断工厂类型,逻辑分散,难以管理。

      • 抽象工厂模式:支持创建一系列相关产品,提供灵活的产品组合方式,是适应复杂对象创建场景的最佳选择。

      应用场景

      抽象工厂模式广泛应用于以下场景:

    3. 数据处理系统:创建不同类型的数据记录工厂。例如,User、Order等。

    4. 电子商务平台:生成订单、用户信息、产品包装等多个相关对象。

    5. 用户界面组件:创建不同形式的UI组件,如ProgressBar、Button等。

    6. 优化思路

      在实际应用中,可以通过动态工厂注册、配置管理,将工厂选择外部化,提升系统的可配置性和灵活性。例如,可以通过配置文件或命令行参数指定需要使用的工厂类型,从而实现工厂的动态切换。

      代码优化示例

      原代码改进点:

    7. 代码清理与格式统一:去掉冗余的代码块(如注释、空白行)和选项内容。

    8. 优化代码结构:统一代码格式、添加必要的注释、简化复杂逻辑。

    9. 插入示例说明:加入注释说明代码功能,便于新手理解。

    10. 优化后的代码:

      class Shape {public: virtual void draw() = 0;};class Rectangle : public Shape {public: void draw() {    std::cout << "draw Rectangle" << std::endl;}};class Square : public Shape {public: void draw() {    std::cout << "draw Square" << std::endl;}};enum ShapeType { rectangle = 0, square};class Color {public: virtual void fill() = 0;};class Red : public Color {public: void fill() {    std::cout << "red" << std::endl;}};class Green : public Color {public: void fill() {    std::cout << "green" << std::endl;}};enum ColorType { red = 0, green}class Factory {public: virtual Shape* Createshape(ShapeType type) = 0;         virtual Color* Fillcolor(ColorType type) = 0;}class ContrateFactory : public Factory {public: Shape* Createshape(ShapeType type) {    if (type == ShapeType::rectangle) {        return new Rectangle();    } else if (type == ShapeType::square) {        return new Square();    } else {        return nullptr;    }}Color* Fillcolor(ColorType type) {    if (type == ColorType::red) {        return new Red();    } else if (type == ColorType::green) {        return new Green();    } else {        return nullptr;    }}}

      总结

      通过抽象工厂模式,可以有效管理和扩展复杂的对象创建逻辑。在实际应用中,可以结合具体工厂实现和配置管理工具,进一步提升代码模块化和可维护性。这种模式在处理多种相关产品的创建时,能够显著提升代码的可读性和灵活性。

      原文内容已被精简优化,清除重复内容,增强可读性,确保成为高质量的技术性文章。

转载地址:http://wihkk.baihongyu.com/

你可能感兴趣的文章
MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
查看>>
Mysql 拼接多个字段作为查询条件查询方法
查看>>
mysql 排序id_mysql如何按特定id排序
查看>>
Mysql 提示:Communication link failure
查看>>
mysql 插入是否成功_PDO mysql:如何知道插入是否成功
查看>>
Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
查看>>
mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
查看>>
mysql 数据库备份及ibdata1的瘦身
查看>>
MySQL 数据库备份种类以及常用备份工具汇总
查看>>
mysql 数据库存储引擎怎么选择?快来看看性能测试吧
查看>>
MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
查看>>
MySQL 数据库的高可用性分析
查看>>
MySQL 数据库设计总结
查看>>
Mysql 数据库重置ID排序
查看>>
Mysql 数据类型一日期
查看>>
MySQL 数据类型和属性
查看>>
mysql 敲错命令 想取消怎么办?
查看>>
Mysql 整形列的字节与存储范围
查看>>
mysql 断电数据损坏,无法启动
查看>>
MySQL 日期时间类型的选择
查看>>