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

embedded/2024/11/29 16:23:08/

定义与概念

抽象工厂模式是一种创建型设计模式。它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。简单来说,抽象工厂就像是一个工厂的抽象蓝图,这个蓝图定义了生产一组产品的方法,但具体怎么生产这些产品(产品的具体实现)由具体的工厂类来完成。

模式结构

  • 抽象工厂类(Abstract Factory):
    这是一个抽象类,它声明了创建一系列产品对象的抽象方法。例如,在一个游戏开发场景中,抽象工厂类可能有创建游戏角色、游戏场景道具等抽象方法。
  • 具体工厂类(Concrete Factory):
    实现了抽象工厂类中声明的抽象方法,用于创建具体的产品对象。每个具体工厂类负责创建一组相关的产品。比如,一个 “中世纪游戏工厂” 具体工厂类可以创建中世纪风格的游戏角色和道具;而一个 “科幻游戏工厂” 具体工厂类则创建科幻风格的相应产品。
  • 抽象产品类(Abstract Product):
    这也是抽象类,它为具体产品类定义了接口。在游戏示例中,抽象产品类可以是游戏角色抽象类,定义了游戏角色的基本行为和属性接口,如移动、攻击等。
  • 具体产品类(Concrete Product):
    实现了抽象产品类的接口,是抽象产品类的具体实现。例如,“中世纪骑士角色” 类和 “科幻机器人角色” 类分别是游戏角色抽象产品类的具体实现,它们有自己特定的移动和攻击方式等属性。

代码示例

假设我们要创建一个简单的图形绘制系统,有两种风格的图形:简约风格和华丽风格。

  • 首先是抽象产品类:
// 抽象图形类
class Shape {
public:virtual void draw() = 0;
};
  • 然后是具体产品类,以圆形为例:
    • 简约风格圆形:
      class SimpleCircle : public Shape {
      public:void draw() override {std::cout << "Drawing a simple circle." << std::endl;}
      };
      
    • 华丽风格圆形:
      class FancyCircle : public Shape {
      public:void draw() override {std::cout << "Drawing a fancy circle." << std::endl;}
      };
      
  • 接着是抽象工厂类:
class ShapeFactory {
public:virtual Shape* createCircle() = 0;
};
  • 最后是具体工厂类:

    • 简约风格工厂:

      class SimpleShapeFactory : public ShapeFactory {
      public:Shape* createCircle() override {return new SimpleCircle();}
      };
      
    • 华丽风格工厂:

      class FancyShapeFactory : public ShapeFactory {
      public:Shape* createCircle() override {return new FancyCircle();}
      };
      
  • 使用:

int main() {ShapeFactory* factory = new SimpleShapeFactory();Shape* circle = factory->createCircle();circle->draw();delete circle;delete factory;return 0;
}

这段代码输出了绘制简约风格圆形的信息。如果我们想要绘制华丽风格的圆形,只需要将SimpleShapeFactory替换为FancyShapeFactory即可。

优点

  • 可维护性高:
    当需要增加新的产品系列或者修改产品的创建逻辑时,只需要修改具体的工厂类和产品类,不需要在大量的代码中去寻找和修改创建对象的地方。例如,在图形绘制系统中,如果要增加一种新的图形风格,只需要创建新的工厂类和对应的产品类,不会影响到已经存在的其他风格的代码。
  • 可扩展性强:
    易于添加新的产品族。比如在游戏开发中,要添加一个新的游戏风格(如神话风格),可以很方便地创建神话风格的工厂类和相应的产品类来生成神话风格的游戏角色和道具。
  • 产品对象的使用和创建分离:
    客户端代码只需要通过抽象工厂类来获取产品对象,不需要知道产品对象的具体创建过程。这使得代码的耦合度降低,客户端代码更加简洁。

缺点

  • 代码复杂:
    由于抽象工厂模式涉及到多个抽象类和具体类的层次结构,代码相对复杂。对于简单的应用场景可能会增加不必要的复杂性。
  • 不适合简单的产品创建:
    如果系统只需要创建一种产品,或者产品之间的关联性不强,使用抽象工厂模式可能会显得有些过度设计。

适用场景

  • 对象创建过程复杂:
    当对象的创建过程涉及到多个步骤或者复杂的配置时,抽象工厂模式可以将这些复杂的创建过程封装在具体工厂类中。例如,在创建数据库连接对象时,可能需要配置各种参数,抽象工厂模式可以很好地封装这些配置过程。
  • 需要创建一组相关对象:
    在游戏开发、图形界面开发等领域,经常需要创建一组相关的对象。比如一个游戏场景需要同时创建游戏角色、游戏道具和游戏背景等相关对象,抽象工厂模式可以方便地实现这一功能。

http://www.ppmy.cn/embedded/141521.html

相关文章

Django 自定义路由转换器

步骤 创建自定义转换器类 必须定义 regex 属性&#xff08;用于匹配参数&#xff09;。必须实现 to_python 和 to_url 方法。 to_python: 将匹配的参数转换为视图函数可用的 Python 数据。to_url: 将数据转换为 URL 格式&#xff08;用于反向解析&#xff09;。 注册转换器 使用…

React Native 应用程序测试指南

写在前面 在软件开发中&#xff0c;测试是确保应用程序质量和稳定性的关键步骤。对于 React Native 应用程序来说&#xff0c;测试同样重要。它可以帮助你发现和修复错误&#xff0c;提高代码的可靠性和可维护性&#xff0c;并加速开发过程。本文将详细介绍如何在 React Nativ…

CListCtrl::InsertItem和临界区导致程序卡死

1.示例代码 MFCApplication1Dlg.h // MFCApplication1Dlg.h : 头文件 //#pragma once #include "afxcmn.h"// CMFCApplication1Dlg 对话框 class CMFCApplication1Dlg : public CDialogEx { // 构造 public:CMFCApplication1Dlg(CWnd* pParent NULL); // 标准构造…

Burp入门(3)-爬虫功能介绍

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;burp功能介绍&#xff08;1&#xff09;_哔哩哔哩_bilibili 本文介绍burp的主动爬虫和被动爬虫功能。 一、主动爬虫 工作原理&#xff1a; 主动…

【Git】Git 完全指南:从入门到精通

Git 完全指南&#xff1a;从入门到精通 Git 是现代软件开发中最重要的版本控制工具之一&#xff0c;它帮助开发者高效地管理项目&#xff0c;支持分布式协作和版本控制。无论是个人项目还是团队开发&#xff0c;Git 都能提供强大的功能来跟踪、管理代码变更&#xff0c;并保障…

Matlab Simulink 电力电子仿真-单相电压型半桥逆变电路分析

目录 一、单相电压型半桥逆变电路仿真模型 1.电路模型 2.电路模型参数 二、仿真分析 三、总结 1.优缺点 2.应用场景 一、单相电压型半桥逆变电路仿真模型 1.电路模型 单相电压型半桥逆变电路是一种常见的逆变电路&#xff0c;主要用于将直流电源转换为交流电源。 &…

【ubuntu24.04】GTX4700 配置安装cuda

筛选显卡驱动显卡驱动 NVIDIA-Linux-x86_64-550.135.run 而后重启:最新的是12.6 用于ubuntu24.04 ,但是我的4700的显卡驱动要求12.4 cuda

python分析wireshark文件

1 pyshark库 支持wireshark的解析等。 安装pyshark pip install pyshark2 dpkt库 这也是一个用于分析pcap文件的库&#xff0c;是所有分析pcap库中最快的一个。 官方参考文档&#xff1a; https://dpkt.readthedocs.io/en/latest/print_packets.html https://dpkt.readthe…