全面升级的对象创建——抽象工厂模式(Python实现和JAVA实现)

1. 引言

大家好!在之前的文章中,我们探讨了简单工厂和工厂方法模式:

轻松创建对象——简单工厂模式(Python实现)
轻松创建对象——简单工厂模式(Java实现)
灵活多变的对象创建——工厂方法模式(Python实现)
灵活多变的对象创建——工厂方法模式(Java实现)

今天,我们要把工厂模式升级到一个新的层次——抽象工厂模式,抽象工厂模式不仅能创建单一对象,还能创建一系列相关的对象;这就像拥有了一个高级的魔法工厂,不仅能生产魔法扫帚,还能生产魔法药水。今天,我们就来揭开抽象工厂模式的神秘面纱,让你的代码更加高效强大。准备好了吗?Let’s go!

2. 什么是抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一个接口,用于创建相关或依赖对象的家族,而无需明确指定具体类。抽象工厂模式通过组合多个工厂方法,使得我们可以创建一系列相关的对象。

抽象工厂模式的优点包括:

  • 分离接口和实现:通过抽象工厂定义对象的创建接口,具体实现交由子类完成。
  • 提高一致性:确保一系列对象之间的关系和约束。

但也有一些缺点:

  • 复杂性增加:增加了系统的复杂性,理解和实现起来需要更多的时间和精力。
  • 扩展困难:增加新的产品族会涉及到抽象工厂和具体工厂的修改,违反开闭原则。

3. 抽象工厂模式的实现(Python)

示例:形状和颜色工厂

假如你是个魔法师,需要创建各种形状和颜色的魔法物品,你可以用抽象工厂模式来实现这一需求:

代码实现
from abc import ABC, abstractmethod# 定义Shape接口
class Shape(ABC):@abstractmethoddef draw(self):pass# 定义具体的Shape类
class Circle(Shape):def draw(self):print("Drawing a Circle")class Square(Shape):def draw(self):print("Drawing a Square")# 定义Color接口
class Color(ABC):@abstractmethoddef fill(self):pass# 定义具体的Color类
class Red(Color):def fill(self):print("Filling with Red")class Blue(Color):def fill(self):print("Filling with Blue")# 定义AbstractFactory接口
class AbstractFactory(ABC):@abstractmethoddef create_shape(self):pass@abstractmethoddef create_color(self):pass# 定义具体工厂类
class ShapeFactory(AbstractFactory):def create_shape(self):return Circle()def create_color(self):return Noneclass ColorFactory(AbstractFactory):def create_shape(self):return Nonedef create_color(self):return Red()# 使用示例
if __name__ == "__main__":shape_factory = ShapeFactory()shape = shape_factory.create_shape()shape.draw()  # 输出: Drawing a Circlecolor_factory = ColorFactory()color = color_factory.create_color()color.fill()  # 输出: Filling with Red
详细代码解析
  • ShapeColor是抽象基类,定义了各自的抽象方法;
  • CircleSquare类实现了Shape接口,RedBlue类实现了Color接口;
  • AbstractFactory是一个抽象基类,定义了创建ShapeColor对象的抽象方法;
  • ShapeFactoryColorFactory类分别实现了AbstractFactory接口,并返回各自的对象实例;
  • 你可以通过调用具体的工厂类(如ShapeFactoryColorFactory)来创建形状和颜色对象,然后调用相应的方法。

4. 抽象工厂模式的实现(JAVA)

// 定义Shape接口
public interface Shape {void draw();
}// 定义具体的Shape类
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Circle");}
}public class Square implements Shape {@Overridepublic void draw() {System.out.println("Drawing a Square");}
}// 定义Color接口
public interface Color {void fill();
}// 定义具体的Color类
public class Red implements Color {@Overridepublic void fill() {System.out.println("Filling with Red");}
}public class Blue implements Color {@Overridepublic void fill() {System.out.println("Filling with Blue");}
}// 定义AbstractFactory接口
public interface AbstractFactory {Shape createShape();Color createColor();
}// 定义具体工厂类
public class ShapeFactory implements AbstractFactory {@Overridepublic Shape createShape() {return new Circle();}@Overridepublic Color createColor() {return null;}
}public class ColorFactory implements AbstractFactory {@Overridepublic Shape createShape() {return null;}@Overridepublic Color createColor() {return new Red();}
}// 使用示例
public class AbstractFactoryDemo {public static void main(String[] args) {AbstractFactory shapeFactory = new ShapeFactory();Shape shape = shapeFactory.createShape();shape.draw();  // 输出: Drawing a CircleAbstractFactory colorFactory = new ColorFactory();Color color = colorFactory.createColor();color.fill();  // 输出: Filling with Red}
}
详细代码解析
  • ShapeColor是接口,定义了各自的方法;
  • CircleSquare类实现了Shape接口,RedBlue类实现了Color接口;
  • AbstractFactory是一个接口,定义了创建ShapeColor对象的方法;
  • ShapeFactoryColorFactory类分别实现了AbstractFactory接口,并返回各自的对象实例;
  • 你可以通过调用具体的工厂类(如ShapeFactoryColorFactory)来创建形状和颜色对象,然后调用相应的方法。

5. 抽象工厂模式的优缺点

优点
  • 分离接口和实现:通过抽象工厂定义对象的创建接口,具体实现交由子类完成。
  • 提高一致性:确保一系列对象之间的关系和约束。
缺点
  • 复杂性增加:增加了系统的复杂性,理解和实现起来需要更多的时间和精力。
  • 扩展困难:增加新的产品族会涉及到抽象工厂和具体工厂的修改,违反开闭原则。

6. 图示

类图

../_images/AbatractFactory.jpg

示意图

img

7. 总结

抽象工厂模式是一个非常强大的设计模式,通过定义一个接口来创建相关或依赖对象的家族,可以有效地提高代码的一致性和可维护性。虽然它会增加系统的复杂性,但在大型项目中,抽象工厂模式依然是一个非常实用的解决方案。希望今天的分享能让大家对抽象工厂模式有更深入的理解。如果你在项目中也用到了抽象工厂模式,欢迎留言分享你的经验和见解!

附录:工厂模式对比

最后,我们来对比一下三种工厂模式的优缺点,以及它们各自适用的场景:

简单工厂模式
  • 优点

    • 简单易懂,适合小型项目。
    • 客户端只需知道传递的参数,不需要关心具体的创建过程。
  • 缺点

    • 违反开闭原则,每增加一种产品都需要修改工厂类。
    • 工厂类职责过重,增加了系统复杂性。
  • 适用场景

    • 适用于对象种类较少,创建逻辑不复杂的场景。
工厂方法模式
  • 优点

    • 符合开闭原则,增加新产品时无需修改现有代码。
    • 客户端只需使用工厂接口,不需关心具体产品的创建过程。
  • 缺点

    • 增加了代码复杂度,类的数量增加。
  • 适用场景

    • 适用于创建对象的逻辑复杂,产品种类较多且经常变化的场景。
抽象工厂模式
  • 优点

    • 分离接口和实现,提高代码的一致性和可维护性。
    • 适用于创建一系列相关或依赖的对象。
  • 缺点

    • 系统复杂性增加,理解和实现需要更多的时间和精力。
    • 扩展新产品族较困难,需要修改抽象工厂和具体工厂。
  • 适用场景

    • 适用于需要创建一系列相关或依赖对象的复杂系统。
      在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/376832.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20240711每日消息队列-------------MQ消息的积压的折磨

目标 解决MQ消息的积压 背景 菜馆系统----------- 系统读取消息,处理业务逻辑,持久化订单和菜品数据,然后将其显示在菜品管理客户端上。 最初我们的用户基数很小,上线后的一段时间内,MQ消息通信还算顺利。 随着用户…

k8s(五)---名称空间

五、名称空间 名称空间是k8s划分不同工作空间的逻辑单位,是k8s资源逻辑隔离的机,。可以给不同的租户,不同的环境、不同的项目创建对应的命名空间。 1、查看名称空间 kubectl get ns kubectl get namespaces 此处展示了四个命名空间 2、管理名称空间 1…

Matlab-Simulink模型保存为图片的方法

有好多种办法将模型保存为图片,这里直接说经常用的 而且贴到Word文档中清晰、操作简单。 simulink自带有截图功能,这两种方法都可以保存模型图片。选择后直接就复制到截切板上了。直接去文档中粘贴就完事了。 这两个格式效果不太一样,第一种清…

[Java IO] 文件的概念与相关操作

一 概念 什么是文件? 文件就是保存数据的地方。 二 文件流 文件在程序中是以流的形式来操作的。 流——数据在数据源(文件)和程序(内存)之间经历的路径。 输入流:数据从数据源(文件&#…

算法学习day12(动态规划)

一、不同的二叉搜索树 二叉搜索树的性质:父节点比左边的孩子节点都大;比右边的孩子节点都小; 由图片可知,dp[3]是可以由dp[2]和dp[1]得出来的。(二叉搜索树的种类和根节点的val有关) 当val为1时,左边是一定没有节点的…

React18+Redux+antd 项目实战 JS

React18Reduxantd 项目实战 js Ant Design插件官网 Axios官网 (可配置请求拦截器和响应拦截器) JavaScript官网 Echarts官网 一、项目前期准备 1.创建新项目 hotel-manager npx create-react-app hotel-manager2.安装依赖 //安装路由 npm i react-router-domnpm i aixos /…

系统架构师考点--系统安全

大家好。今天我来总结一下系统安全相关的考点,这类考点每年都会考到,一般是在上午场客观题,占2-4分。 一、信息安全基础知识 信息安全包括5个基本要素:机密性、完整性、可用性、可控性与可审查性 (1)机密性:确保信息…

【机器学习理论基础】回归模型定义和分类

定义 回归分析是研究自变量与因变量之间数量变化关系的一种分析方法,它主要是通过因变量 Y Y Y与影响它的自变量 X i X_i Xi​ 之间的回归模型,衡量自变量 X i X_i Xi​ 对因变量 Y Y Y 的影响能力的,进而可以用来预测因变量Y的发展趋势。…

基于Python/MATLAB长时间序列遥感数据处理及在全球变化、植被物候提取、植被变绿与生态系统固碳分析、生物量估算与趋势分析应用

植被是陆地生态系统中最重要的组分之一,也是对气候变化最敏感的组分,其在全球变化过程中起着重要作用,能够指示自然环境中的大气、水、土壤等成分的变化,其年际和季节性变化可以作为地球气候变化的重要指标。此外,由于…

Python3极简教程(一小时学完)下

目录 PEP8 代码风格指南 知识点 介绍 愚蠢的一致性就像没脑子的妖怪 代码排版 缩进 制表符还是空格 每行最大长度 空行 源文件编码 导入包 字符串引号 表达式和语句中的空格 不能忍受的情况 其他建议 注释 块注释 行内注释 文档字符串 版本注记 命名约定 …

WPF学习(4) -- 数据模板

一、DataTemplate 在WPF(Windows Presentation Foundation)中,DataTemplate 用于定义数据的可视化呈现方式。它允许你自定义如何展示数据对象,从而实现更灵活和丰富的用户界面。DataTemplate 通常用于控件(如ListBox、…

鸿蒙语言基础类库:【@ohos.util (util工具函数)】

util工具函数 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 该模块…

Wikijs 部署教程

以下是一个 Wikijs 部署的简单教程,涵盖了使用 Docker 和直接安装两种方式: 方法一: 使用 Docker (推荐) Docker 是一个方便快捷的方式来部署 Wikijs,它可以避免许多手动配置步骤。 安装 Docker: 按照 https://docs.docker.com/…

jvm 07 GC算法,内存池

01 垃圾判断算法 1.1引用计数算法 最简单的垃圾判断算法。在对象中添加一个属性用于标记对象被引用的次数,每多一个其他对象引用,计数1, 当引用失效时,计数-1,如果计数0,表示没有其他对象引用,…

TensorBoard ,PIL 和 OpenCV 在深度学习中的应用

重要工具介绍 TensorBoard: 是一个TensorFlow提供的强大工具,用于可视化和理解深度学习模型的训练过程和结果。下面我将介绍TensorBoard的相关知识和使用方法。 TensorBoard 简介 TensorBoard是TensorFlow提供的一个可视化工具,用于&#x…

代理模式(大话设计模式)C/C++版本

代理模式 C #include <iostream> using namespace std;class Subject // Subject 定义了RealSubject和Proxy的共用接口..这样就在任何使用RealSubject的地方都可以使用Proxy { public:virtual void func(){cout << "Subject" << endl;} };class R…

Leetcode3200. 三角形的最大高度

Every day a Leetcode 题目来源&#xff1a;3200. 三角形的最大高度 解法1&#xff1a;模拟 枚举第一行是红色还是蓝色&#xff0c;再按题意模拟即可。 代码&#xff1a; /** lc appleetcode.cn id3200 langcpp** [3200] 三角形的最大高度*/// lc codestart class Solutio…

《Linux系统编程篇》认识在linux上的文件 ——基础篇

前言 Linux系统编程的文件操作如同掌握了一把魔法钥匙&#xff0c;打开了无尽可能性的大门。在这个世界中&#xff0c;你需要了解文件描述符、文件权限、文件路径等基础知识&#xff0c;就像探险家需要了解地图和指南针一样。而了解这些基础知识&#xff0c;就像学会了魔法咒语…

【Python】数据分析-Matplotlib绘图

数据分析 Jupyter Notebook Jupyter Notebook: 一款用于编程、文档、笔记和展示的软件。 启动命令&#xff1a; jupyter notebookMatplotlib 设置中文格式&#xff1a;plt.rcParams[font.sans-serif] [KaiTi] # 查看本地所有字体 import matplotlib.font_manager a sorted…

Hologres+Flink企业级实时数仓核心能力介绍

讲师&#xff1a;骆撷冬 Hologres PD 随着业务发展&#xff0c;业务对于时效性的要求在逐渐提升。各种场景都需要实时&#xff0c;例如春晚实时直播大屏、双11 GMV实时大屏、实时个性化推荐等等多种场景&#xff0c;都对数据的时效性有着非常高的要求。随着实时需求的发展&…