#设计模式#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 函数)使用具体工厂来创建和操作具体产品,而不需要知道产品的内部实现细节。

这种模式的目的是提供一个接口,用于创建一系列相关或依赖对象,而不需要指定它们具体的类。这样,当需要引入新的产品族或改变产品的具体实现时,系统的其他部分可以保持不变,从而提高了系统的灵活性和可维护性。

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

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

相关文章

ubuntu制作deb安装包

这篇文章很好 https://blog.csdn.net/weixin_51495377/article/details/132797013 使用脚本来控制的好处是比较灵活与功能强大 这里附上我的脚本 #!/bin/sh set -e echo "Installing My pd_sns Application..." cp -r ../application/lib/cartographer_ros/* /home…

大模型重塑电商,淘宝、百度、京东讲出新故事

配图来自Canva可画 随着AI技术日渐成熟,大模型在各个领域的应用也越来越深入,国内互联网行业也随之进入了大模型竞赛的后半场,开始从“百模大战”转向了实际应用。大模型从通用到细分垂直领域的跨越,也让更多行业迎来了新的商机。…

对象新增属性为什么不更新?

data () {return {obj: {a: 1}} }methods: {update () {this.obj.b 2} } 上面的伪代码,当我们执行 update 更新 obj 时,我们预期视图是要随之更新的,实际是并不会 这个其实很好理解,我们先要明白 vue 中 data init 的时机&am…

P1629 邮递员送信

题目描述 有一个邮递员要送东西,邮局在节点 1。他总共要送 n−1 样东西,其目的地分别是节点 2 到节点 n。由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有 m 条道路。这个邮递员每次只能带一样东西,并且运…

【Vue3源码学习】— CH2.6 effect.ts:详解

effect.ts:详解 1. 理解activeEffect1.1 定义1.2 通过一个例子来说明这个过程a. 副作用函数的初始化b. 执行副作用函数前c. 访问state.countd. get拦截器中的track调用e. 修改state.count时的set拦截器f. trigger函数中的依赖重新执行 1.3 实战应用1.4 activeEffect…

LLM推理入门指南②:深入解析KV缓存

在本系列文章《LLM推理入门指南①:文本生成的初始化与解码阶段》中,作者对Transformer解码器的文本生成算法进行了高层次概述,着重介绍了两个阶段:单步初始化阶段,即提示的处理阶段,和逐个生成补全词元的多…

FreeRTOS作业day1

使用定时器2让黄灯闪烁 核心代码 man.c HAL_TIM_Base_Start_IT(&htim1);//以中断的方式打开定时器1,定时器开始工作计数,当时间到达500ms后,执行中断回调函数 HAL_TIM_Base_Start_IT(&htim2);//以中断的方式打开定时器2&#xff0…

pytorch中torch.stack()用法虽简单,但不好理解

函数功能 沿一个新维度对输入一系列张量进行连接,序列中所有张量应为相同形状,stack 函数返回的结果会新增一个维度。也即是把多个2维的张量凑成一个3维的张量;多个3维的凑成一个4维的张量…以此类推,也就是在增加新的维度上面进…

浪潮信息AIStation与潞晨科技Colossal-AI 完成兼容性认证!

为进一步提升大模型开发效率,近年来,浪潮信息持续加强行业合作,携手业内头部,全面进攻大模型领域。日前,浪潮信息AIStation智能业务创新生产平台与潞晨科技Colossal-AI大模型开发工具完成兼容性互认证。后续&#xff0…

如何使用 RabbitMQ 进行消息的发送和接收

1、创建连接工厂: ConnectionFactory factory new ConnectionFactory(); factory.setHost("localhost"); // 设置 RabbitMQ 服务器的主机地址 Connection connection factory.newConnection(); // 创建连接 Channel channel connection.createChannel…

性能测试VS负载测试VS压力测试

性能测试 性能测试的目的不是去找bugs,而是排除系统的瓶颈,以及为以后的回归测试建立一个基准。而性能测试的操作,实际上就是一个非常小心受控的测量分析过程。在理想的情况下,被测软件在这个时候已经是足够稳定了,所以这个过程得以顺利的进行。 一组清晰已定义好的…

FFmpeg将绿幕视频处理成透明视频播放

怎么在网页端插入透明视频呢,之前在做Web3D项目时,使用threejs可以使绿幕视频透明显示在三维场景中,但是在网页端怎么让绿幕视频透明显示呢? 如图上图,视频背景遮挡住后面网页内容 想要如下图效果 之前有使用过ffmpeg…

机器人码垛机:智能仓储系统的重要组成部分

随着科技的飞速进步,机器人技术已经渗透到了许多行业领域,其中,仓储业尤为显著。机器人码垛机作为智能仓储系统的重要组成部分,不仅提高了码垛效率,还降低了人工成本和安全风险。然而,在其广泛应用的同时&a…

HTML5 和 CSS3 提高

一、HTML5 的新特性 HTML5 的新增特性主要是针对于以前的不足,增加了一些新的标签、新的表单和新的表单属性等。这些新特性都有兼容性问题,基本是 IE9 以上版本的浏览器才支持,如果不考虑兼容性问题,可以大量使用这些新特性。 声明…

NineAi3.5 –支持GPT绘图,语音播报,联网访问,上下文关联,语音模式

NineAi3.5 –支持GPT绘图,语音播报,联网访问,上下文关联,语音模式 基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具,它能够通过学习和理解人类的语言来进行对话, 还能根据聊天的上下文进行互动&…

Vue3之setup方法

Vue 3 的 setup 方法是 Vue Composition API 的一部分,用于组织和复用 Vue 组件的逻辑代码。Vue Composition API 允许您以更具响应性和函数式的方式来组织和复用 Vue 组件中的代码,特别是在处理复杂逻辑或跨组件共享逻辑时非常有用。 以下是关于 setup…

Java NIO详解

一、概念 NIO, 即new io,也叫非阻塞io 二、NIO三个核心组件: Buffer数据缓冲区Channel通道Selector选择器 1、Buffer缓冲区 缓冲区本质上是一个可以存放数据的内存块(类似数组),可以在这里进行数据写入和读取。此…

第十四届省赛大学B组(C/C++) 冶炼金属

题目描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金属 O 恰好可以冶炼出一个特殊金属 X,当普通金属 O 的数目不足 V 时,无法继续…

【Java】LinkedList模拟实现

目录 整体框架IMyLinkedList接口IndexNotLegalException异常类MyLinkedList类成员变量(节点信息)addFirst(头插)addLast(尾插)在指定位置插入数据判断是否存在移除第一个相等的节点移除所有相等的节点链表的长度打印链表释放回收链表 整体框架 IMyLinkedList接口 这个接口用来…

Leetcode704_二分查找

1.leetcode原题链接:. - 力扣(LeetCode) 2.题目描述 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标&#xff…