当前位置: 首页 > news >正文

#设计模式#3.1用做松鼠桂鱼来理解抽象工厂(对象创建型模式)

概念:xx工厂,xx产品 区分

工厂是动作,产品是结果(菜品)

概念:抽象xx,具体xx 区分

  1. 抽象产品:“中式菜品”
    具体产品:“麻婆豆腐”、“宫保鸡丁”
    抽象工厂:“中式菜品”的规范,它可能包括食材的选择、切割方式、烹饪温度和时间等。抽象工厂为制作中式菜品提供了一套标准流程,但不具体到每一道菜的详细烹饪方法。
    具体工厂:如何制作“麻婆豆腐的具体流程

  2. 抽象产品(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.

这个例子展示了如何使用抽象工厂模式来创建和管理具体产品。通过这种方式,我们可以轻松地添加新的菜品或菜系,只需定义新的具体产品类和相应的具体工厂即可。这样的设计提高了代码的可维护性和扩展性。

回归定义

让我们将“松鼠桂鱼”的例子与抽象工厂模式的原始定义和组件联系起来,以便更好地理解这个设计模式的各个部分。

在抽象工厂模式中,我们通常有以下几个主要组件:

  1. Abstract Product: 这是一个接口或抽象类,定义了产品必须实现的公共接口。在我们的“松鼠桂鱼”例子中,Dish 类可以被视为一个抽象产品,它定义了菜品应该具备的基本属性和方法,如 preparecookserve

  2. Concrete Product: 这是实现了抽象产品接口的具体类。在我们的示例中,SquirrelFish 类是一个具体产品,它继承自 Dish 并提供了这些方法的具体实现。

  3. Abstract Factory: 这是一个接口,它定义了一组用于创建抽象产品的方法。在我们的示例中,ChineseKitchenFactory 是一个抽象工厂,它定义了一个 create_dish 方法,这个方法应该返回一个 Dish 类型的菜品。

  4. Concrete Factory: 这是一个实现了抽象工厂接口的具体类。在我们的示例中,HuaiyangKitchenFactory 是一个具体工厂,它实现了 ChineseKitchenFactory 接口,并提供了 create_dish 方法的具体实现,用于创建具体的淮扬菜菜品,如 “松鼠桂鱼”。

  5. 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> 五大函数&#xff1a; strlen()、strcpy、strcat()、strcmp()、strstr() 用法&#xff1a; strlen()&#xff1a;计算字符串长度&#xff0c;但不计\0这个字符 #include <string.h> int main() {char arr[] "abcdef"…...

Linux安装redis(基于CentOS系统,Ubuntu也可参考)

前言&#xff1a;本文内容为实操记录&#xff0c;仅供参考&#xff01; 一、下载并解压Redis 1、执行下面的命令下载redis&#xff1a;wget https://download.redis.io/releases/redis-6.2.6.tar.gz 2、解压redis&#xff1a;tar xzf redis-6.2.6.tar.gz 3、移动redis目录&a…...

ChatGPT引领量化交易革命:AI在金融创新的浪潮中崭露头角

随着科技的飞速发展,金融领域正迎来一场前所未有的创新浪潮。在这场变革中,ChatGPT凭借其卓越的自然语言处理能力和深度学习能力,正引领量化交易进入新时代。 量化交易,作为现代金融领域的一种重要交易方式,依赖于复杂的数学模型和大量的历史数据来制定交易策略。然而,传…...

无忧微服务:如何实现大流量下新版本的发布自由

作者&#xff1a;项良、十眠 微服务上云门槛降低&#xff0c;用好微服务才是关键 据调研数据显示&#xff0c;约 70% 的生产故障是由变更引起的。在阿里云上的企业应用如茶百道、极氪汽车和来电等&#xff0c;他们是如何解决变更引起的稳定性风险&#xff0c;实现了在白天高流…...

Halcon3D表面平面度检测-平面差值法

//倾斜平面矫正 https://blog.csdn.net/m0_51559565/article/details/137146179 //平面度和平面缺陷检测&#xff0c;平面矫正法 https://blog.csdn.net/m0_51559565/article/details/137163729前言 通常我们对表面平面度进行检测时&#xff0c;通常使用2种方式。1&#xff1a…...

golang 在多线程中避免 CPU 指令重排

发布日期&#xff1a;2024-03-26 16:29:39 起因 golang 的发明初衷便是多线程&#xff0c;是一门专门用于多线程高并发的编程语言。其独创的 GMP 模型在多线程的开发上提供了很大的便利。 现代计算机基本上都是多核 CPU 的结构。CPU 在进行指令运行的时候&#xff0c;为了提高…...

自动化更新包文件--shell脚本

自动化更新包文件--shell脚本 背景手动更包自动化更包 背景 作为一名实施工程师&#xff0c;当然也协助做些测试的工作&#xff0c;当产品功能开发后&#xff0c;研发会将本次迭代涉及的前后端包文件提供过来。有时会因为一些原因研发没法现场开发&#xff0c;那就需要我们配合…...

Vue element-plus 导航栏 [el-menu]

导航栏 [el-menu] Menu 菜单 | Element Plus el-menu有很多属性和子标签&#xff0c;为网站提供导航功能的菜单。 常用标签&#xff1a; 它里面有两个子标签。el-menu-item&#xff0c;它其实就是el-menu每一个里面的item&#xff0c;item就是真实匹配到路由的每个栏目&#…...

数据结构——数组

数组定义&#xff1a; 在计算机科学中&#xff0c;数组是由一组元素&#xff08;值或变量&#xff09;组成的数据结构&#xff0c;每个元素有至少一个索引或键来标识。 因为数组内的元素是连续存储的&#xff0c;所以数组中元素的地址&#xff0c;可以通过其索引计算出来。 性…...

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个视频素材库网站下载推荐

在视频创作领域&#xff0c;选择正确的高质量无水印素材网站能够极大地丰富您的作品&#xff0c;让每一帧都鲜活起来。下面&#xff0c;我们继续为您介绍更多优质的视频素材网站&#xff0c;每一个都是您创作旅程中的宝贵资源。 1. 蛙学府&#xff08;中国&#xff09; 集合了…...

ChatGPT与传统搜索引擎的区别:智能对话与关键词匹配的差异

引言 随着互联网的快速发展&#xff0c;信息的获取变得比以往任何时候都更加便捷。在数字化时代&#xff0c;人们对于获取准确、及时信息的需求愈发迫切。传统搜索引擎通过关键词匹配的方式为用户提供了大量的信息&#xff0c;然而&#xff0c;这种机械式的检索方式有时候并不…...

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无限次数:点击直达 学术论文写作新利器&#xff1a;ChatGPT技巧详解 在如今信息爆炸的时代&#xff0c;学术论文写作变得愈发重要且具有挑战性。随着人工智能技术的不断发展&#xff0c;ChatGPT作为一种强大的写作辅助工具&#xff0c;为学术论文创作者提供了全新的可能…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...

DAY 45 超大力王爱学Python

来自超大力王的友情提示&#xff1a;在用tensordoard的时候一定一定要用绝对位置&#xff0c;例如&#xff1a;tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾&#xff1a; tensorboard的发展历史和原理tens…...