(三)趣学设计模式 之 抽象工厂模式!

在这里插入图片描述

目录

    • 一、 啥是抽象工厂模式?
    • 二、 为什么要用抽象工厂模式?
    • 三、 抽象工厂模式怎么实现?
    • 四、 抽象工厂模式的应用场景
    • 五、 抽象工厂模式的优点和缺点
    • 六、 抽象工厂模式与工厂方法模式的区别
    • 七、 总结

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解工厂方法模式请看: (二)趣学设计模式 之 工厂方法模式!

这篇文章带你详细认识一下设计模式中的抽象工厂模式

一、 啥是抽象工厂模式?

想象一下,你开了一家家具店 🪑,要卖不同风格的家具,比如现代风格和古典风格。每种风格都包含一套完整的家具,包括沙发 🛋️、茶几 ☕️、椅子 💺。

抽象工厂模式就像这样,每个风格都有自己的专属工厂,现代风格工厂生产现代风格的沙发、茶几和椅子,古典风格工厂生产古典风格的沙发、茶几和椅子。这样,你只需要选择一个风格的工厂,就能得到一整套风格统一的家具!

简单来说,抽象工厂模式就是:生产一系列相关的产品,保证这些产品风格统一!

二、 为什么要用抽象工厂模式?

  • 产品族概念: 强调产品之间的关联性,保证产品风格统一。
  • 易于切换产品族: 只需要更换工厂,就能切换到另一套风格的产品。
  • 符合开闭原则: 添加新的产品族,只需要添加新的工厂类即可,不需要修改原来的代码 👍。

三、 抽象工厂模式怎么实现?

// 1. 定义抽象产品接口
interface Sofa {void comfort(); // 舒适度
}interface CoffeeTable {void place(); // 放置物品
}interface Chair {void sit(); // 坐
}// 2. 定义具体的产品类
// 现代风格家具
class ModernSofa implements Sofa {@Overridepublic void comfort() {System.out.println("现代沙发,舒适度高! ✨");}
}class ModernCoffeeTable implements CoffeeTable {@Overridepublic void place() {System.out.println("现代茶几,可以放置各种物品! 💻");}
}class ModernChair implements Chair {@Overridepublic void sit() {System.out.println("现代椅子,坐着很舒服! 😊");}
}// 古典风格家具
class ClassicSofa implements Sofa {@Overridepublic void comfort() {System.out.println("古典沙发,很有历史感! 🕰️");}
}class ClassicCoffeeTable implements CoffeeTable {@Overridepublic void place() {System.out.println("古典茶几,可以放置古董! 🏺");}
}class ClassicChair implements Chair {@Overridepublic void sit() {System.out.println("古典椅子,坐着很有仪式感! 👑");}
}// 3. 定义抽象工厂接口
interface FurnitureFactory {Sofa createSofa();CoffeeTable createCoffeeTable();Chair createChair();
}// 4. 定义具体的工厂类
// 现代风格家具工厂
class ModernFurnitureFactory implements FurnitureFactory {@Overridepublic Sofa createSofa() {System.out.println("现代家具工厂正在生产现代沙发! 🛋️");return new ModernSofa();}@Overridepublic CoffeeTable createCoffeeTable() {System.out.println("现代家具工厂正在生产现代茶几! ☕");return new ModernCoffeeTable();}@Overridepublic Chair createChair() {System.out.println("现代家具工厂正在生产现代椅子! 💺");return new ModernChair();}
}// 古典风格家具工厂
class ClassicFurnitureFactory implements FurnitureFactory {@Overridepublic Sofa createSofa() {System.out.println("古典家具工厂正在生产古典沙发! 🛋️");return new ClassicSofa();}@Overridepublic CoffeeTable createCoffeeTable() {System.out.println("古典家具工厂正在生产古典茶几! ☕");return new ClassicCoffeeTable();}@Overridepublic Chair createChair() {System.out.println("古典家具工厂正在生产古典椅子! 💺");return new ClassicChair();}
}// 5. 客户端使用
public class Client {public static void main(String[] args) {// 创建现代风格家具工厂FurnitureFactory modernFactory = new ModernFurnitureFactory();// 生产一套现代风格家具Sofa modernSofa = modernFactory.createSofa();CoffeeTable modernCoffeeTable = modernFactory.createCoffeeTable();Chair modernChair = modernFactory.createChair();modernSofa.comfort(); // 输出:现代沙发,舒适度高! ✨modernCoffeeTable.place(); // 输出:现代茶几,可以放置各种物品! 💻modernChair.sit(); // 输出:现代椅子,坐着很舒服! 😊// 创建古典风格家具工厂FurnitureFactory classicFactory = new ClassicFurnitureFactory();// 生产一套古典风格家具Sofa classicSofa = classicFactory.createSofa();CoffeeTable classicCoffeeTable = classicFactory.createCoffeeTable();Chair classicChair = classicFactory.createChair();classicSofa.comfort(); // 输出:古典沙发,很有历史感! 🕰️classicCoffeeTable.place(); // 输出:古典茶几,可以放置古董! 🏺classicChair.sit(); // 输出:古典椅子,坐着很有仪式感! 👑}
}

代码解释:

  • SofaCoffeeTableChair:抽象产品接口,定义了家具的通用行为。
  • ModernSofaModernCoffeeTableModernChairClassicSofaClassicCoffeeTableClassicChair:具体的产品类,实现了家具接口,分别代表现代风格和古典风格的沙发、茶几和椅子。
  • FurnitureFactory:抽象工厂接口,定义了创建一套家具的通用方法。
  • ModernFurnitureFactoryClassicFurnitureFactory:具体的工厂类,实现了 FurnitureFactory 接口,分别负责创建现代风格和古典风格的家具。
  • createSofa()createCoffeeTable()createChair():创建家具的方法。

输出结果:

现代家具工厂正在生产现代沙发! 🛋️
现代家具工厂正在生产现代茶几! ☕
现代家具工厂正在生产现代椅子! 💺
现代沙发,舒适度高! ✨
现代茶几,可以放置各种物品! 💻
现代椅子,坐着很舒服! 😊
古典家具工厂正在生产古典沙发! 🛋️
古典家具工厂正在生产古典茶几! ☕
古典家具工厂正在生产古典椅子! 💺
古典沙发,很有历史感! 🕰️
古典茶几,可以放置古董! 🏺
古典椅子,坐着很有仪式感! 👑

四、 抽象工厂模式的应用场景

  • GUI 框架: 可以使用抽象工厂模式创建不同风格的界面组件(按钮、文本框、窗口等)。
  • 游戏开发: 可以使用抽象工厂模式创建不同风格的游戏角色、场景、道具等。
  • 操作系统: 可以使用抽象工厂模式创建不同风格的操作系统界面。

五、 抽象工厂模式的优点和缺点

优点:

  • 产品族概念: 强调产品之间的关联性,保证产品风格统一。
  • 易于切换产品族: 只需要更换工厂,就能切换到另一套风格的产品。
  • 符合开闭原则: 添加新的产品族,只需要添加新的工厂类即可,不需要修改原来的代码 👍。

缺点:

  • 难以扩展产品: 如果要添加新的产品类型(比如添加一个书柜),需要修改所有的工厂接口和实现类,比较麻烦 😥。
  • 复杂度增加: 代码结构相对复杂,理解起来稍微困难。

六、 抽象工厂模式与工厂方法模式的区别

抽象工厂模式和工厂方法模式都是工厂模式,但它们解决的问题不同:

  • 工厂方法模式: 关注的是单个产品的创建,每个工厂只负责创建一种产品。
  • 抽象工厂模式: 关注的是产品族的创建,每个工厂负责创建一系列相关的产品。

举个例子:

  • 工厂方法模式: 就像不同的甜品店,蛋糕店只卖蛋糕,饼干店只卖饼干,面包店只卖面包。
  • 抽象工厂模式: 就像不同的家具店,现代家具店卖现代风格的沙发、茶几和椅子,古典家具店卖古典风格的沙发、茶几和椅子。

总结一下:

特性工厂方法模式抽象工厂模式
关注点单个产品的创建产品族的创建
产品关系产品之间没有必然联系产品之间存在关联,风格统一
扩展性易于扩展新的产品类型易于扩展新的产品族,但难以扩展单个产品类型
适用场景产品类型较多,需要灵活扩展的场景产品族概念明确,且需要灵活切换产品族的场景

七、 总结

  • 抽象工厂模式用于创建一系列相关的产品,保证这些产品风格统一。
  • 每个工厂负责创建一套完整的产品族。
  • 添加新的产品族,只需要添加新的工厂类即可,符合开闭原则。
  • 抽象工厂模式适用于产品族概念明确,且需要灵活切换产品族的场景。
  • 抽象工厂模式与工厂方法模式的区别在于,抽象工厂模式关注的是产品族的创建,而工厂方法模式关注的是单个产品的创建。

希望这篇文章能让你彻底理解抽象工厂模式,并区分它与工厂方法模式! 👍

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

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

相关文章

【GPU驱动】OpenGLES图形管线渲染机制

OpenGLES图形管线渲染机制 OpenGL/ES 的渲染管线也是一个典型的图形流水线(Graphics Pipeline),包括多个阶段,每个阶段都负责对图形数据进行处理。管线的核心目标是将图形数据转换为最终的图像,这些图像可以显示在屏幕…

vscode软件中引入vant组件

一、vant简介 Vant 是一个轻量、可靠的移动端组件库,于 2017 年开源。 目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本,并由社区团队维护 React 版本和支付宝小程序版本。 官网:介绍 - Vant Weapp 里面的快速上手的教程&a…

Meterpreter之getsystem命令提权原理详解

在 Windows 渗透测试过程中,获取系统的最高权限是攻击者的最终目标。getsystem 是 Metasploit 中用于提权的命令,旨在将当前的 Meterpreter 会话 提升至 NT AUTHORITY\SYSTEM 权限。需要特别注意的是,getsystem 并不是 Metasploit 框架&#…

深入理解HttpSecurity的设计

一、HttpSecurity的应用 在前章节的介绍中我们讲解了基于配置文件的使用方式,也就是如下的使用。 也就是在配置文件中通过 security:http 等标签来定义了认证需要的相关信息,但是在SpringBoot项目中,我们慢慢脱离了xml配置文件的方式,在SpringSecurity中提供了HttpSecurity…

软件集成测试的技术要求

文章目录 一、软件集成测试的概念二、测试对象三、测试目的四、进入条件五、测试内容六、测试环境七、测试实施方一、软件集成测试的概念 软件集成测试(Software Integration Testing),也称部件测试,一种旨在暴露接口以及集成组件间交互时存在的缺陷的测试。集成测试是灰盒…

STM32-有关内存堆栈、map文件

STM32堆栈空间大小设置_stm32堆栈分配大小-CSDN博客 STM32堆栈的大小及内存四(五)区的分析 - 天街小雨润地狠 - 博客园 .map文件的位置

java方法学习

java 方法 在Java中,方法是类(或对象)的行为或功能的实现。(一起实现一个功能)java的方法类似于其他语言的函数,是一段用来完成特定功能的代码片段。 方法是解决一类问题步骤的有序结合。 方法包含于类或…

编程小白冲Kaggle每日打卡(12)--kaggle学堂:<机器学习简介>模型如何工作

Kaggle官方课程链接:How Models Work 本专栏旨在Kaggle官方课程的汉化,让大家更方便地看懂。 How Models Work 第一步,如果你是机器学习的新手。 Introduction 我们将从概述机器学习模型的工作原理和使用方法开始。如果你以前做过统计建模…

企业知识库构建智慧协作平台

内容概要 现代企业知识库作为智慧协作平台的核心载体,其架构设计需兼顾知识资产的系统性沉淀与敏捷化应用。通过集中化管理机制,企业可将分散于各部门的文档、流程指南及项目经验转化为结构化数字资产,形成具备智能检索能力的知识图谱。在技…

Swiper插件的运用和学习

Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 Swiper 是目前最流行的免费开源轮播组件之一,它功能强大、高度可定制且兼容性好,支持移动端手势操作和丰富的交互动画。 下载Swiper压缩包 轮播图演示页面。可以看见各种不同切换效果的轮播图 然后解压…

Git 合并冲突解决与状态分析笔记

前言 在使用 Git 进行代码管理时,合并分支是常见的操作之一。然而,在合并过程中可能会遇到冲突问题,尤其是在多人协作开发的场景下。本文将详细介绍如何解决 Git 合并冲突,并结合实际案例分析 git status 的输出含义。 背景 在…

ChromeDriver版本不匹配问题的解决

今天运行一个以前写的爬虫程序,遇到如下错误: selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 121 Current browser version is 133.0.6943.98 w…

支持向量机(SVM):算法讲解与原理推导

1 SVM介绍 SVM是一个二类分类器,它的全称是Support Vector Machine,即支持向量机。 SVM的目标是找到一个超平面,使用两类数据离这个超平面越远越好,从而对新的数据分类更准确,即使分类器更加健壮。比如上面的图中&am…

华为云deepseek大模型平台:deepseek满血版

华为云硅基流动使用Chatbox接入DeepSeek-R1满血版671B 1、注册: 华为云deepseek大模型平台注册:https://cloud.siliconflow.cn/i/aDmz6aVN 说明:填写邀请码的话邀请和被邀请的账号都会获得2000 万 Tokens;2个帐号间不会与其他关联…

保姆级! 本地部署DeepSeek-R1大模型 安装Ollama Api 后,Postman本地调用 deepseek

要在Postman中访问Ollama API并调用DeepSeek模型,你需要遵循以下步骤。首先,确保你有一个有效的Ollama服务器实例运行中,并且DeepSeek模型已经被加载。 可以参考我的这篇博客 保姆级!使用Ollama本地部署DeepSeek-R1大模型 并java…

ESP32-S3 实战指南:BOOT-KEY 按键驱动开发全解析

一、基础知识 本篇我们使用 BOOT 按键来学习一下 GPIO 功能,首先补充一下相关术语介绍。 1、GPIO(General Purpose Input/Output) GPIO 是微控制器上的通用引脚,既可以作为输入(读取外部信号)&#xff0…

Win11 24h2 不能正常使用ensp的问题(已解决)

因为Win11 24h2的内核大小更改,目前virtualbox在7.1.4中更新解决了。所以Win11 24H2系统版本无法使用 5.x.xx的virtualbox版本,virtualbox对于这个5.x.xx版本早已停止维护,所以这个以后不会有调整。 对应的报错代码是 virtualbox错误代码&…

常用电脑,护眼软件推荐 f.lux 3400K | 撰写论文 paper

常用电脑?平均每天用 5 个小时?你就要考虑用一个护眼软件了,对皮肤也好。因为电脑屏幕有辐射,比如蓝光。 f.lux 作为一款专业护眼软件,值得使用。之前用了三年的 Iris Pro,现在 f.lux 做的更好了。 使用…

在 Mac ARM 架构的 macOS 系统上启用 F1 键作为 Snipaste 的截屏快捷键

在 Mac ARM 架构的 macOS 系统上启用 F1 键作为 Snipaste 的截屏快捷键,主要涉及到两个方面:确保 F1 键作为标准功能键工作 和 在 Snipaste 中设置 F1 为快捷键。 因为 Mac 默认情况下,F1-F12 键通常用作控制屏幕亮度、音量等系统功能的快捷键…

开源一款I2C电机驱动扩展板-FreakStudio多米诺系列

总线直流电机扩展板 原文链接: FreakStudio的博客 摘要 设计了一个I2C电机驱动板,通过I2C接口控制多个电机的转速和方向,支持刹车和减速功能。可连接16个扩展板,具有PWM输出、过流过热保护和可更换电机驱动芯片。支持按键控制…