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

news/2024/4/19 16:59:28/

概念: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.ppmy.cn/news/1404979.html

相关文章

AWS相关服务说明

互联网网关 官网 # 官网 https://docs.aws.amazon.com/zh_cn/vpc/latest/userguide/VPC_Internet_Gateway.htmlInternet 网关是一种横向扩展、冗余且高度可用的 VPC 组件,支持在 VPC 和 Internet 之间进行通信。它支持 IPv4 和 IPv6 流量。它不会对您的网络流量造…

[Linux]基础IO(中)---理解重定向与系统调用dup2的使用、缓冲区的意义

重定向理解 在Linux下,当打开一个文件时,进程会遍历文件描述符表,找到当前没有被使用的 最小的一个下标,作为新的文件描述符。 代码验证: ①:先关闭下标为0的文件,在打开一个文件,…

合并两个单链表

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 但行前路,不负韶华&#…

探析Drools规则引擎的工作机制

目录 一、工作原理 二、工作流程 2.1 初始化环境 2.2 添加规则文件 2.3 编译规则文件 2.4 插入到工作内存 2.5 规则匹配与激活 2.6 规则执行 三、Drools 其他特性 3.1 符合事实 3.2 决策表 3.3 规则生命周期管理 3.4 规则流 四、Rete 算法 一、工作原理 Drools 规则引擎的工…

谷歌(Google)技术面试——在线评估问题(一)

谷歌(Google)面试过程的第一步,你可能会收到一个在线评估链接。 评估有效期为 7 天,包含两个编码问题,需要在一小时内完成。 以下是一些供你练习的在线评估问题。 在本章结尾处,还提供了有关 Google 面试不…

最新AI工具系统ChatGPT网站运营源码SparkAi系统V6.0版本,GPTs应用、AI绘画、AI换脸、垫图混图、Suno-v3-AI音乐生成大模型全支持

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持GPT…

酷开科技智慧AI让酷开系统大显身手!

时代的浪潮汹涌而至,人工智能作为技术革新和产业变革的重要引擎,正深刻地影响着各行各业。在科技的海洋中,AI技术正逐渐渗透到我们的日常生活中,为我们带来前所未有的便捷和智慧。酷开科技用技术探索智慧AI,别看它只是…

微服务(基础篇-007-RabbitMQ部署指南)

目录 05-RabbitMQ快速入门--介绍和安装_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p65&vd_source60a35a11f813c6dff0b76089e5e138cc 1.单机部署 1.1.下载镜像 1.2.安装MQ 2.集群部署 2.1.集群分类 2.2.设置网络 视频地址: 05-Rab…

达梦数据库用户与权限管理

达梦数据库用户与权限管理 用户管理口令策略管理用户资源限制 权限管理一般权限特殊权限 角色管理 用户管理 达梦数据库安装后创建的内置用户: SYS:内置用户,不允许登录。该用户下有常用的数据字典;SYSDBA:系统管理员…

Linux(05) Debian 系统修改主机名

查看主机名 方法1:hostname hostname 方法2:cat etc/hostname cat /etc/hostname 如果在创建Linux系统的时候忘记修改主机名,可以采用以下的方式来修改主机名称。 修改主机名 注意,在linux中下划线“_”可能是无效的字符&…

elment UI el-date-picker 月份组件选定后提交后台页面显示正常,提交后台字段变成时区格式

需求&#xff1a;要实现一个日期的月份选择<el-date-picker :typeformData.dateType :value-formatdateFormat v-modelformData.leaveFactoryDateplaceholder选择月份></el-date-picker>错误示例&#xff1a;将日期显示类型(type)dateType或将日期绑定值的格式(val…

Linux网络编程一(协议、TCP协议、UDP、socket编程、TCP服务器端及客户端)

文章目录 协议1、分层模型结构2、网络应用程序设计模式3、ARP协议4、IP协议5、UDP协议6、TCP协议 Socket编程1、网络套接字(socket)2、网络字节序3、IP地址转换4、一系列函数5、TCP通信流程分析 第二次更新&#xff0c;自己再重新梳理一遍… 协议 协议&#xff1a;指一组规则&…

Android Studio学习7——常用控件view

Android控件 双击shift键——>搜索想要找的文件 Ctrlshift回车——>补全“&#xff1b;”号 CtrlX——>删除一行&#xff0c;只需把鼠标放在那一行 windows自带字体

深入探索Linux的lsof命令

在Linux系统中&#xff0c;了解哪些文件被哪些进程打开对于系统管理和问题诊断是极其重要的。这正是lsof命令&#xff0c;即List Open Files&#xff0c;发挥其强大功能的场景。本文旨在详细介绍lsof的起源、底层原理、参数意义&#xff0c;常见用法&#xff0c;并详解其返回结…

Hive初始化元数据库(默认是derby数据库)时候出现缺少方法的错误com.google.common.base.Preconditions

错误的出现&#xff1a; 下载好hive后&#xff0c;初始化元数据库&#xff08;使用内置derby数据测试&#xff09;&#xff0c;出现报错 初始化hive元数据&#xff1a;schematool -dbType derby -initSchema 这个原因是与 Hive 和 Hadoop 版本的 Guava 版本不一样导致的。 解决…

CSS层叠样式表学习(2)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS&#xff08;2&#xff09;的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 二、CSS基础选择器 2.1 CSS选择器的作用 2.2 选择器分类 2.3 标签选择器 2.…

动态规划(Dynamic Programming)详解

动态规划&#xff08;Dynamic Programming&#xff0c;简称DP&#xff09;就像是个聪明的厨师&#xff0c;他懂得怎样把一道复杂的菜肴分成一小块一小块来做&#xff0c;而且他知道怎么利用之前做好的部分&#xff0c;避免重复劳动&#xff0c;最后拼凑成美味佳肴。 比如&…

Debian 配置国内软件源

为什么需要&#xff1f; Debian安装好之后默认是没有软件源的&#xff0c;只能通过本身的光盘上的软件进行安装&#xff0c;这样明显是不能够满足我们的需要的&#xff0c;考虑到国内的上网速度以及环境&#xff0c;配置一个国内的阿里镜像源是最好的选择。 使用 sudo vim /…

更高效、更简洁的 SQL 语句编写丨DolphinDB 基于宏变量的元编程模式详解

元编程&#xff08;Metaprogramming&#xff09;指在程序运行时操作或者创建程序的一种编程技术&#xff0c;简而言之就是使用代码编写代码。通过元编程将原本静态的代码通过动态的脚本生成&#xff0c;使程序员可以创建更加灵活的代码以提升编程效率。 在 DolphinDB 中&#…

Python中主要数据结构的使用

文章目录 数组队列 queue双端队列 deque栈 stack优先队列 priority_queue集合 set映射/字典 map 数组 使用内置类型list实现&#xff0c;主要有如下操作&#xff1a; array [] array.append(1) length len(array) if not array:# 列表为空print("array is empty"…