抽象工厂模式(Abstract Factory Pattern)

很好!你现在已经开始接触设计模式了,而**抽象工厂模式(Abstract Factory Pattern)是一种常用于“创建一系列相关产品”**的经典设计模式。

我会一步步帮你理解:


🧠 一句话解释

抽象工厂模式:提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。


🎯 为什么需要它?

当你面对以下场景时,它就很有用:

“我有多个产品(按钮、窗口、菜单),而且这些产品有不同的风格(比如 Mac 风格、Windows 风格),希望能在不改代码的前提下切换整套产品风格。”


✅ 举个生活类比

你要布置房间,选一整套家具。你不能桌子 IKEA 风、椅子中式风格,应该风格统一

  • 工厂1:生产一整套「现代风」家具(现代风沙发 + 现代风桌子)
  • 工厂2:生产一整套「中式风」家具(中式风沙发 + 中式风桌子)

→ 你只选工厂,不关心家具内部怎么造。


🧪 Python 完整代码示例

🧱 Step 1: 抽象产品类

from abc import ABC, abstractmethodclass Button(ABC):@abstractmethoddef click(self):passclass Window(ABC):@abstractmethoddef open(self):pass

🏭 Step 2: 具体产品类

class MacButton(Button):def click(self):print("Mac Button clicked!")class WinButton(Button):def click(self):print("Windows Button clicked!")class MacWindow(Window):def open(self):print("Mac Window opened!")class WinWindow(Window):def open(self):print("Windows Window opened!")

🏗️ Step 3: 抽象工厂类

class GUIFactory(ABC):@abstractmethoddef create_button(self) -> Button:pass@abstractmethoddef create_window(self) -> Window:pass

🏢 Step 4: 具体工厂类

class MacFactory(GUIFactory):def create_button(self):return MacButton()def create_window(self):return MacWindow()class WinFactory(GUIFactory):def create_button(self):return WinButton()def create_window(self):return WinWindow()

🖥️ Step 5: 客户端代码

def render_ui(factory: GUIFactory):button = factory.create_button()window = factory.create_window()button.click()window.open()# 使用 Mac 风格
render_ui(MacFactory())
# 使用 Windows 风格
render_ui(WinFactory())

🧭 流程图(Mermaid)

GUIFactory
+create_button()
+create_window()
MacFactory
+create_button()
+create_window()
WinFactory
+create_button()
+create_window()
Button
+click()
Window
+open()
MacButton
+click()
WinButton
+click()
MacWindow
+open()
WinWindow
+open()

✅ 优点

  • ✅ 保证产品族之间的一致性(按钮 + 窗口风格一致)
  • ✅ 封装创建逻辑,符合开闭原则
  • ✅ 易于切换产品系列(换工厂即可)

❌ 缺点

  • ❌ 类和接口数量增加(每种产品都要写抽象 + 实现)
  • ❌ 扩展“新产品”不方便(比如新增菜单)→ 要修改所有工厂

🔚 总结口诀

✅ 抽象工厂负责生产“产品系列”,只换工厂,不动逻辑。适用于“同一风格的多组件系统”。


如果你希望,我可以把这个例子替换成游戏皮肤工厂、汽车工厂、手机UI工厂来帮助你更贴近生活。你想试试哪个?🎮🚗📱

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

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

相关文章

Thymeleaf模板引擎从入门到实战:Spring Boot整合与核心用法详解

在 Java Web 开发的世界里,模板引擎是连接后端数据与前端展示的重要桥梁。Thymeleaf 凭借其强大的功能和简洁的语法,逐渐成为众多开发者的首选。如果你正在寻找一款能够让你的 Web 应用开发更加高效、代码更加优雅的模板引擎,那么 Thymeleaf …

【HarmonyOS】作业三 UI

目录 一. 单选题(共10题,10分) 1. (单选题, 1分)关于Tabs组件页签的位置设置,下面描述错误的是 2. (单选题, 1分)下面哪个组件不能包含子组件? 3. (单选题, 1分)ArkTS语言的实现计数器功能的组件名称是以下哪个? 4. (单选题…

《算法笔记》10.6小节——图算法专题->拓扑排序 问题 C: Legal or Not

题目描述 ACM-DIY is a large QQ group where many excellent acmers get together. It is so harmonious that just like a big family. Every day,many "holy cows" like HH, hh, AC, ZT, lcc, BF, Qinz and so on chat on-line to exchange their ideas. When so…

博客信息管理/博客管理

🛠 博客管理模块:设计建议 你应该以To B 的后台系统思路来设计,但保持简单、轻量级、自己易维护是关键。下面是针对你这个场景的建议。 🧱 前端页面结构(React/Vue 可用) 页面 说明 博客列表页 展示所有博…

全平台开源即时通讯IM框架MobileIMSDK:7端+TCP/UDP/WebSocket协议,鸿蒙NEXT端已发布,5.7K Stars

一、基本介绍 MobileIMSDK是一套全平台原创开源IM通信层框架: 超轻量级、高度提炼,lib包50KB以内;精心封装,一套API同时支持UDP、TCP、WebSocket三种协议(可能是全网唯一开源的);客户端支持iOS…

SpringBoot商城平台系统设计与开发

概述 SpringBoot商城平台系统实现了商品展示、购物车、订单管理等商城核心功能,适合作为计算机专业设计项目或商城项目开发参考,实现商城平台的核心功能,学习商品管理、订单处理、支付集成等关键技术实现。 主要内容 1. 前台用户功能模块 …

【网络原理】深入理解HTTPS协议

本篇博客给大家带来的是网络原理的知识点, 由于时间有限, 分三天来写, 本篇为线程第三篇,也是最后一篇. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动…

【C语言练习】018. 定义和初始化结构体

018. 定义和初始化结构体 018. 定义和初始化结构体1. 定义结构体示例1:定义一个简单的结构体输出结果2. 初始化结构体示例2:在声明时初始化结构体输出结果示例3:使用指定初始化器初始化结构体(C99及以上标准支持)输出结果3. 结构体数组示例4:定义和初始化结构体数组输出结…

3D版同步帧游戏

以下是实现一个3D版同步帧游戏的详细步骤与完整代码示例。我们将以第一人称射击游戏(FPS)为原型,重点讲解3D空间中的同步机制优化。 项目升级:3D版核心改动 1. 3D坐标系与消息结构 // common/messages.go type Vector3 struct {X float32 `json:"x"`Y float32 `…

卷积神经网络进化史:从LeNet-5到现代架构的完整发展脉络

摘要 本文系统梳理卷积神经网络(CNN)从诞生到繁荣的发展历程。从1998年Yann LeCun开创性的LeNet-5出发,重点解析2012年引爆深度学习革命的AlexNet,并详细拆解后续演进的五大技术方向:网络深度化(VGG)、卷积功能强化(ResNet)、检测任务迁移(F…

在 Windows 中安装 Pynini 的记录

#工作记录 概述 Pynini 是一个用于加权有限状态文法编译的 Python 库,广泛应用于自然语言处理(NLP)领域。以下记录旨在用于回顾和帮助大家在 Windows 系统中安装 Pynini。 安装思路: 优先用conda虚拟环境 或 在python3.12的vir…

深挖Java之:运算符与输入器

今天我要介绍的是在Java中对于运算符与输入器的一些基础语法运算符与输入器的代码示例以及应用场景,他们在应用上的优势与劣势作说明介绍: 介绍:运算符与输入器是两个基础且关键的概念,它们共同构成了程序与用户、程序与数据之间…

动态规划之多状态问题1

题目解析: 也就是给一个预约数组,选择一些数字,让其总和最大,但不能选择相邻的两个数字 算法原理: 依旧可以根据经验题目 以dp[i]位置结尾时,巴拉巴拉 根据题目要求补充完整,dp[i]&#xff…

计网_可靠传输ARQ机制

2024.09.04:网工老姜&beokayy网工学习笔记 第5节 可靠传输机制 5.1 可靠传输5.2 ARQ机制、ARQ协议5.3 ARQ简介(可靠传输)5.3.1 停止等待协议(1)无差错情况(2)有差错情况确认丢失确认迟到 5.…

华为eNSP:多区域集成IS-IS

一、什么是多区域集成IS-IS? 多区域集成IS-IS是一种基于中间系统到中间系统(IS-IS)协议优化的网络架构设计,通过多区域协同、路径优化和扩展性增强实现高效路由管理,其核心特征如下: 1、分布式架构与多区…

自定义Dockerfile,发布springboot项目

(1) 上传jar包 把hello项目打成一个可执行的jar包 hello-1.0-SNAPSHOT.jar,把这个jar包上传到linux中 (2) 创建文件,文件名my_hello(就是一个Dockerfile),内容如下 #1.定义父镜像(定义当前工程依赖的环境):…

vscode源代码管理Tab-文件右侧标志(M、A 等)的含义

Git 常用标志(M、A 等)的含义 在 VSCode 的源代码管理(Source Control)标签页中,文件右侧显示的 Monaco 装饰徽章(Badge)(如 M、A 等),本质上是对 Git 文件状态标志 的可视化呈现。…

基于 vue-flow 实现可视化流程图

vue-flow 是一个基于 Vue.js 的强大且灵活的可视化流程图库,它允许开发者轻松创建交互式的流程图、工作流图、节点图等。 主要特点 易于使用 :提供了简洁的 API 和组件,开发者可以快速上手并创建复杂的流程图。高度可定制 :支持…

【愚公系列】《Manus极简入门》015-时间管理顾问:“商业时间规划大师”

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! &#x1f…

OpenRouter:轻松集成多家AI大模型的统一接口平台指南

想象一下,你已经在系统中集成了 OpenAI API,但现在你希望通过 Google Gemini 和 Anthropic API 扩展能力。你会为每个服务商单独创建和管理账户,使用不同的 SDK,让代码变得更加复杂吗?还是更倾向于只用一行代码就能访问…