#设计模式#3.1用做松鼠桂鱼来理解抽象工厂(对象创建型模式)
概念:xx工厂,xx产品 区分
工厂是动作,产品是结果(菜品)
概念:抽象xx,具体xx 区分
-
抽象产品:“中式菜品”
具体产品:“麻婆豆腐”、“宫保鸡丁”
抽象工厂:“中式菜品”的规范,它可能包括食材的选择、切割方式、烹饪温度和时间等。抽象工厂为制作中式菜品提供了一套标准流程,但不具体到每一道菜的详细烹饪方法。
具体工厂:如何制作“麻婆豆腐的具体流程 -
抽象产品(Abstract Product):这是定义了一类具有共同特征的产品的接口或基类。它描述了这些产品共有的属性和方法,但不提供具体的实现。
“淮扬菜”
,“名称”、“价格”和“主料”,以及方法如“准备()”、“烹饪()”和“摆盘()”。
具体产品(Concrete Product):这是抽象产品的具体实例,它实现了抽象产品定义的所有特征,并提供了具体的实现细节。“淮扬菜的松鼠桂鱼”
代表了这道菜品完成的状态,准备好供顾客享用。已经烹饪完成、准备好上桌的菜品。
抽象工厂(Abstract Factory):这是一个接口或类,它定义了创建一系列相关或相互依赖的抽象产品的方法。它规定了可以创建哪些类型的产品,但没有指定具体的实现细节。做菜集团、做菜的一般步骤
具体工厂(Concrete Factory):这是实现了抽象工厂接口的类,它提供了创建具体产品的详细步骤和方法。“淮扬菜工厂”
根据“做菜集团”定义的一般步骤来专门制作淮扬菜系的菜品,包括“松鼠桂鱼”在内的各种菜肴。这相当于厨房中的厨师或烹饪团队,负责根据菜谱和食材准备和烹饪菜品。这个过程就像是备菜和烹饪的过程,最终“制作”出了一道可以上桌的菜品。
代码示例:做淮扬菜的松鼠桂鱼
当然可以。让我们通过一个简化的例子来描述抽象工厂模式在制作“松鼠桂鱼”这道菜品中的应用。在这个例子中,我们将定义一个抽象产品“菜品”,一个具体产品“松鼠桂鱼”,一个抽象工厂“中厨工厂”,以及一个具体工厂“淮扬菜工厂”。
首先,我们定义抽象产品“菜品”:
class Dish:def __init__(self, name):self.name = namedef prepare(self):raise NotImplementedError("prepare() must be defined by subclass")def cook(self):raise NotImplementedError("cook() must be defined by subclass")def serve(self):raise NotImplementedError("serve() must be defined by subclass")
接下来,我们创建一个具体产品“松鼠桂鱼”:
class SquirrelFish(Dish):def __init__(self):super().__init__("松鼠桂鱼")def prepare(self):print("准备桂鱼和相关食材...")def cook(self):print("炸桂鱼至金黄色...")def serve(self):print("将桂鱼装盘,撒上松子,完成摆盘...")def price(self):return 120 # 假设“松鼠桂鱼”的价格固定为120元
现在,我们定义一个抽象工厂“中厨工厂”,它负责创建不同类型的中式菜品:
class ChineseKitchenFactory:def create_dish(self, dish_type):raise NotImplementedError("create_dish() must be defined by subclass")
最后,我们创建一个具体工厂“淮扬菜工厂”,它能够制作“松鼠桂鱼”等淮扬菜系的菜品:
class HuaiyangKitchenFactory(ChineseKitchenFactory):def create_dish(self, dish_type):if dish_type == "squirrel_fish":return SquirrelFish()else:raise ValueError("Unknown dish type")def make_dish(self, dish):dish.prepare()dish.cook()dish.serve()print(f"The dish {dish.name} costs {dish.price()} yuan.")
现在,我们可以使用“淮扬菜工厂”来制作“松鼠桂鱼”:
def main():kitchen_factory = HuaiyangKitchenFactory()dish = kitchen_factory.create_dish("squirrel_fish")kitchen_factory.make_dish(dish)if __name__ == "__main__":main()
当运行这段代码时,将会输出以下内容:
准备桂鱼和相关食材...
炸桂鱼至金黄色...
将桂鱼装盘,撒上松子,完成摆盘...
The dish 松鼠桂鱼 costs 120 yuan.
这个例子展示了如何使用抽象工厂模式来创建和管理具体产品。通过这种方式,我们可以轻松地添加新的菜品或菜系,只需定义新的具体产品类和相应的具体工厂即可。这样的设计提高了代码的可维护性和扩展性。
回归定义
让我们将“松鼠桂鱼”的例子与抽象工厂模式的原始定义和组件联系起来,以便更好地理解这个设计模式的各个部分。
在抽象工厂模式中,我们通常有以下几个主要组件:
-
Abstract Product: 这是一个接口或抽象类,定义了产品必须实现的公共接口。在我们的“松鼠桂鱼”例子中,
Dish
类可以被视为一个抽象产品,它定义了菜品应该具备的基本属性和方法,如prepare
、cook
和serve
。 -
Concrete Product: 这是实现了抽象产品接口的具体类。在我们的示例中,
SquirrelFish
类是一个具体产品,它继承自Dish
并提供了这些方法的具体实现。 -
Abstract Factory: 这是一个接口,它定义了一组用于创建抽象产品的方法。在我们的示例中,
ChineseKitchenFactory
是一个抽象工厂,它定义了一个create_dish
方法,这个方法应该返回一个Dish
类型的菜品。 -
Concrete Factory: 这是一个实现了抽象工厂接口的具体类。在我们的示例中,
HuaiyangKitchenFactory
是一个具体工厂,它实现了ChineseKitchenFactory
接口,并提供了create_dish
方法的具体实现,用于创建具体的淮扬菜菜品,如 “松鼠桂鱼”。 -
Client: 这是使用抽象工厂和具体工厂的代码部分。在我们的示例中,
main
函数充当客户端的角色,它使用HuaiyangKitchenFactory
来创建和处理SquirrelFish
菜品。
将这些组件与抽象工厂模式的原始定义联系起来,我们可以看到:
- 抽象产品(
Dish
)定义了菜品共有的接口。 - 具体产品(
SquirrelFish
)提供了这些接口的具体实现。 - 抽象工厂(
ChineseKitchenFactory
)定义了创建菜品的接口。 - 具体工厂(
HuaiyangKitchenFactory
)实现了这个接口,并提供了创建特定菜品的具体方法。 - 客户端(
main
函数)使用具体工厂来创建和操作具体产品,而不需要知道产品的内部实现细节。
这种模式的目的是提供一个接口,用于创建一系列相关或依赖对象,而不需要指定它们具体的类。这样,当需要引入新的产品族或改变产品的具体实现时,系统的其他部分可以保持不变,从而提高了系统的灵活性和可维护性。
相关文章:
#设计模式#3.1用做松鼠桂鱼来理解抽象工厂(对象创建型模式)
概念:xx工厂,xx产品 区分 工厂是动作,产品是结果(菜品) 概念:抽象xx,具体xx 区分 抽象产品:“中式菜品” 具体产品:“麻婆豆腐”、“宫保鸡丁” 抽象工厂:“…...
adb基本命令
下载安装 adb 概述: ADB 全称为 Android Debug Bridge,起到调试桥的作用,是一个客户端-服务器端程序。其中客户端是用来操作的电脑,服务端是 Android 设备。 下载地址: Windows版本:https://dl.google.com/android/repository/pl…...
小工具实战-Python实现小工具输出字符串大小写转换、字符串统计、编解码、MD5加密
小工具实战-Python实现小工具输出字符串大小写转换、字符串统计、编解码、MD5加密 学习建议字符串大小写转换实现思路部分代码 字符串统计实现思路部分代码: 字符串编解码实现思路部分代码 字符串MD5加密实现思路部分代码 小工具整体设计设计思路工具完整代码实现输…...
MySQL进阶-----索引的语法与SQL性能分析
目录 前言 一、索引语法 1.SQL语法 2.案例演示 二、SQL性能分析 三、慢查询日志 1.开启日志 2.测试样例 四、profile详情 1.开启profile 2.profile测试SQL语句 五、explain详情 1.语法结构 2.执行顺序示例(id) 3.执行性能示例(type) 前言 本…...
Ansible剧本playbooks详解
一、playbook简介 playbook是ansible用于配置,部署和管理托管主机剧本,通过playbook的详细描述,执行其中一系列tasks,playbook字面意思是剧本,现实中由演员按剧本表演,在ansible中由计算机进行安装&#x…...
vue3封装Element导航菜单
1. 导航外层布局 AsideView.vue <template><el-menu:default-active"defaultActive"class"my-menu":collapse"isCollapse":collapse-transition"false"open"handleOpen"close"handleClose"><menu…...
字符串的函数
头文件 # include <string.h> 五大函数: strlen()、strcpy、strcat()、strcmp()、strstr() 用法: strlen():计算字符串长度,但不计\0这个字符 #include <string.h> int main() {char arr[] "abcdef"…...
Linux安装redis(基于CentOS系统,Ubuntu也可参考)
前言:本文内容为实操记录,仅供参考! 一、下载并解压Redis 1、执行下面的命令下载redis:wget https://download.redis.io/releases/redis-6.2.6.tar.gz 2、解压redis:tar xzf redis-6.2.6.tar.gz 3、移动redis目录&a…...
ChatGPT引领量化交易革命:AI在金融创新的浪潮中崭露头角
随着科技的飞速发展,金融领域正迎来一场前所未有的创新浪潮。在这场变革中,ChatGPT凭借其卓越的自然语言处理能力和深度学习能力,正引领量化交易进入新时代。 量化交易,作为现代金融领域的一种重要交易方式,依赖于复杂的数学模型和大量的历史数据来制定交易策略。然而,传…...
无忧微服务:如何实现大流量下新版本的发布自由
作者:项良、十眠 微服务上云门槛降低,用好微服务才是关键 据调研数据显示,约 70% 的生产故障是由变更引起的。在阿里云上的企业应用如茶百道、极氪汽车和来电等,他们是如何解决变更引起的稳定性风险,实现了在白天高流…...
Halcon3D表面平面度检测-平面差值法
//倾斜平面矫正 https://blog.csdn.net/m0_51559565/article/details/137146179 //平面度和平面缺陷检测,平面矫正法 https://blog.csdn.net/m0_51559565/article/details/137163729前言 通常我们对表面平面度进行检测时,通常使用2种方式。1:…...
golang 在多线程中避免 CPU 指令重排
发布日期:2024-03-26 16:29:39 起因 golang 的发明初衷便是多线程,是一门专门用于多线程高并发的编程语言。其独创的 GMP 模型在多线程的开发上提供了很大的便利。 现代计算机基本上都是多核 CPU 的结构。CPU 在进行指令运行的时候,为了提高…...
自动化更新包文件--shell脚本
自动化更新包文件--shell脚本 背景手动更包自动化更包 背景 作为一名实施工程师,当然也协助做些测试的工作,当产品功能开发后,研发会将本次迭代涉及的前后端包文件提供过来。有时会因为一些原因研发没法现场开发,那就需要我们配合…...
Vue element-plus 导航栏 [el-menu]
导航栏 [el-menu] Menu 菜单 | Element Plus el-menu有很多属性和子标签,为网站提供导航功能的菜单。 常用标签: 它里面有两个子标签。el-menu-item,它其实就是el-menu每一个里面的item,item就是真实匹配到路由的每个栏目&#…...
数据结构——数组
数组定义: 在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识。 因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来。 性…...
python asyncio websockets server
python websocket server在收到接受消息处理完后会默认关闭连接。需要在msg_handler里面加个while true就能一直保持连接了。 start_server websockets.serve(msg_handler, "0.0.0.0", 29967) asyncio.get_event_loop().run_until_complete(start_server) asyncio.…...
视频素材免费网站有哪些?8个视频素材库网站下载推荐
在视频创作领域,选择正确的高质量无水印素材网站能够极大地丰富您的作品,让每一帧都鲜活起来。下面,我们继续为您介绍更多优质的视频素材网站,每一个都是您创作旅程中的宝贵资源。 1. 蛙学府(中国) 集合了…...
ChatGPT与传统搜索引擎的区别:智能对话与关键词匹配的差异
引言 随着互联网的快速发展,信息的获取变得比以往任何时候都更加便捷。在数字化时代,人们对于获取准确、及时信息的需求愈发迫切。传统搜索引擎通过关键词匹配的方式为用户提供了大量的信息,然而,这种机械式的检索方式有时候并不…...
xargs后调用bash自定义函数(写该函数文本到脚本, 并引导PATH)
xargs后调用bash自定义函数 需要3步骤,如下 function to_markdown_href_func() { fp$1 #echo $fpecho -e "\n[${fp}](${PREFIX}/${fp})" }BIN/tmp/bin/ F$BIN/to_markdown_href_func.sh mkdir -p $BIN 获得函数to_markdown_href_func的文本 ,写文本到 /tmp/bin/to_ma…...
学术论文写作新利器:ChatGPT技巧详解
ChatGPT无限次数:点击直达 学术论文写作新利器:ChatGPT技巧详解 在如今信息爆炸的时代,学术论文写作变得愈发重要且具有挑战性。随着人工智能技术的不断发展,ChatGPT作为一种强大的写作辅助工具,为学术论文创作者提供了全新的可能…...
Spring整合JDBC
1、引入依赖 <properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><depen…...
详解Qt中的布局管理器
Qt中的布局管理是用于组织用户界面中控件(如按钮、文本框、标签等)位置和尺寸调整的一种机制。说白了就是创建了一种规则,随着窗口变化其中的控件大小位置跟着变化。Qt提供了多种布局管理器,每种都有其特定用途和特点。以下是对Qt…...
MyBatis 参数重复打印的bug
现象 最近有个需求,需要在mybatis对数据库进行写入操作的时候,根据条件对对象中的某个值进行置空,然后再进行写入,这样数据库中的值就会为空了。 根据网上查看的资料,选择在 StatementHandler 类执行 update 的时候进…...
ES6学习之路:迭代器Iterator和生成器Generator
迭代器 一、知识背景 什么是迭代器 迭代器就是在一个数据集合中不断取出数据的过程迭代和遍历的区别 遍历是把所有数据都取出迭代器注重的是依次取出数据,它不会在意有多少数据,也不会保证能够取出多少或者能够把数据都取完。比如斐波那契额数列&#…...
如何使用 DynamiCrafter Interp Loop 无缝连接两张照片
DynamiCrafter Interp Loop 是一个基于 AI 的工具,可以用来无缝连接两张照片。它使用深度学习技术来生成中间帧,从而使两张照片之间的过渡更加自然流畅。 使用步骤 访问 DynamiCrafter Interp Loop 网站:https://huggingface.co/spaces/Dou…...
今天起,Windows可以一键召唤GPT-4了
ChatGPT狂飙160天,世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 微软 AI 大计的最后一块拼图完成了? 把 Copilot 按钮放在 Window…...
使用Kaggle API快速下载Kaggle数据集
前言 在使用Kaggle网站下载数据集时,直接在网页上点击下载可能会很慢,甚至会出现下载失败的情况。本文将介绍如何使用Kaggle API快速下载数据集。 具体步骤 安装Kaggle API包 在终端中输入以下命令来安装Kaggle API相关的包: pip install…...
java 通过 microsoft graph 调用outlook(二)
这次提供一些基础调用方式API PS: getMailFolders 接口返回的属性中,包含了未读邮件数量unreadItemCount 一 POM文件 <!-- office 365 --><dependency><groupId>com.google.guava</groupId><artifactId>guava<…...
【机器学习】代价函数
🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…...
[leetcode] 100. 相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入:p [1,2,3], q [1,2,3] 输出:true示例 2&a…...
手表网站 源码/推广业务平台
1. New在c里是用来在堆里申请一段内存。程序结束之前需要用delete手动释放内存。并且不受作用域的控制。 格式: typename * pointer_name new typename; …… delete pointer_name; 如果为数组申请内存,因为数组是存储在连续的一段内存里,所…...
如何说课网站建设/友情网站
写这篇文章来由,有朋友说下面这样的代码看不懂。choice input("please input:n").strip()[0].lower()很多对于有经验的程序员来说,这些都不是事,但对于初学者来说,看到这样的语法头有点大。这个其实是面向对象中方法链…...
余姚做轴承网站/关键词优化公司排名
声音信号: 梅尔频率倒谱系数(MFCC) 声谱图: spectrogram声谱图: 共振峰:...
数据标注接单平台/公司seo
导读:标题言过其实,但是草根站长都有自己真实的故事。我2015年6月1日买的空间和域名,到现在的2016年6月1日正好1年。这篇文章主要讲我这个草根站长这一年用来血的教训换来的SEO终极算法。血的教训1、学习了半个多月网络营销,弃学了…...
手机网页游戏大全/学seo优化
介绍 之前技术导航突然在网上流行起来,源码圈也是跟风搭建了一个,但是奈何经营不善,网站直今5个多月,每天也就二百来个ip,所以干脆就把源码分享出来吧,源码无任何后门。 直接上传根目录解压就可以了&…...
写一个wordpress下载插件/网上销售平台怎么做
我想限制Linux机箱的传入(下载)速度.两者,配置的盒子和交通源(HTTP服务器)都连接到同一个交换机,如果没有配置整形,下载速度为30MBps########## downlink ############## slow downloads down to somewhat less than the real speed to prevent# queuing at our ISP. Tune to s…...