4-Python与设计模式--抽象工厂模式
4-Python与设计模式–抽象工厂模式
一、快餐点餐系统
想必大家一定见过类似于麦当劳自助点餐台一类的点餐系统吧。在一个大的触摸显示屏上,
有三类可以选择的上餐品:
汉堡等主餐、小食、饮料。当我们选择好自己需要的食物,支付完成后,订单就生成了。
下面,我们用今天的主角--工厂模式--来生成这些食物的逻辑主体。
首先,来看主餐的生成(仅以两种汉堡为例)。
class Burger():name=""price=0.0def getPrice(self):return self.pricedef setPrice(self,price):self.price=pricedef getName(self):return self.name
class cheeseBurger(Burger):def __init__(self):self.name="cheese burger"self.price=10.0
class spicyChickenBurger(Burger):def __init__(self):self.name="spicy chicken burger"self.price=15.0
其次,是小食。(内容基本一致)
class Snack():name = ""price = 0.0type = "SNACK"def getPrice(self):return self.pricedef setPrice(self, price):self.price = pricedef getName(self):return self.nameclass chips(Snack):def __init__(self):self.name = "chips"self.price = 6.0class chickenWings(Snack):def __init__(self):self.name = "chicken wings"self.price = 12.0
class Beverage():name = ""price = 0.0type = "BEVERAGE"def getPrice(self):return self.pricedef setPrice(self, price):self.price = pricedef getName(self):return self.nameclass coke(Beverage):def __init__(self):self.name = "coke"self.price = 4.0class milk(Beverage):def __init__(self):self.name = "milk"self.price = 5.0
以上的Burger,Snack,Beverage,都可以认为是该快餐店的产品,由于只提供了抽象方法, 我们把它们叫抽象产品类,而cheese burger等6个由抽象产品类衍生出的子类,叫作具体产品类。
接下来,“工厂”就要出现了。
class foodFactory():type=""def createFood(self,foodClass):print self.type," factory produce a instance."foodIns=foodClass()return foodIns
class burgerFactory(foodFactory):def __init__(self):self.type="BURGER"
class snackFactory(foodFactory):def __init__(self):self.type="SNACK"
class beverageFactory(foodFactory):def __init__(self):self.type="BEVERAGE"
同样,foodFactory为抽象的工厂类,而burgerFactory,snackFactory,beverageFactory为具体的工厂类。
在业务场景中,工厂模式是如何“生产”产品的呢?
if __name__=="__main__":burger_factory=burgerFactory()snack_factorry=snackFactory()beverage_factory=beverageFactory()cheese_burger=burger_factory.createFood(cheeseBurger)print cheese_burger.getName(),cheese_burger.getPrice()chicken_wings=snack_factorry.createFood(chickenWings)print chicken_wings.getName(),chicken_wings.getPrice()coke_drink=beverage_factory.createFood(coke)print coke_drink.getName(),coke_drink.getPrice()
可见,业务中先生成了工厂,然后用工厂中的createFood方法和对应的参数直接生成产品实例。
打印结果如下:
BURGER factory produce a instance. cheese burger 10.0 SNACK factory
produce a instance. chicken wings 12.0 BEVERAGE factory produce a
instance. coke 4.0
二、工厂模式、简单工厂模式、抽象工厂模式
工厂模式的定义如下:定义一个用于创建对象的接口,让子类决定实例化哪个类。
工厂方法使一个类的实例化延迟到其子类。其通用类图如下。其产品类定义产品的公共属性和接口,
工厂类定义产品实例化的“方式”。
在上述例子中,工厂在使用前必须实例化。如果,把工厂加个类方法,写成如下形式:
class simpleFoodFactory():@classmethoddef createFood(cls,foodClass):print "Simple factory produce a instance."foodIns = foodClass()return foodIns
在场景中写成如下形式:
spicy_chicken_burger=simpleFoodFactory.createFood(spicyChickenBurger)
这样,省去了将工厂实例化的过程。这种模式就叫做简单工厂模式。还是在上述例子中,
createFood方法中必须传入foodClass才可以指定生成的food实例种类,如果,将每一个细致的产品都
建立对应的工厂(如cheeseBurger建立对应一个cheeseBurgerFactory),这样,生成食物时,
foodClass也不必指定。事实上,此时,burgerFactory就是具体食物工厂的一层抽象。
这种模式,就是抽象工厂模式。
三、工厂模式的优点和应用
工厂模式、抽象工厂模式的优点:
1、工厂模式巨有非常好的封装性,代码结构清晰;在抽象工厂模式中,其结构还可以随着需要进行更深或者更浅的抽象层级调整,非常灵活;
2、屏蔽产品类,使产品的被使用业务场景和产品的功能细节可以分而开发进行,是比较典型的解耦框架。
工厂模式、抽象工厂模式的使用场景:
1、当系统实例要求比较灵活和可扩展时,可以考虑工厂模式或者抽象工厂模式实现。比如,在通信系统中,高层通信协议会很多样化,同时,上层协议依赖于下层协议,那么就可以对应建立对应层级的抽象工厂,根据不同的“产品需求”去生产定制的实例。
四、工厂类模式的不足
1、工厂模式相对于直接生成实例过程要复杂一些,所以,在小项目中,可以不使用工厂模式;
2、抽象工厂模式中,产品类的扩展比较麻烦。毕竟,每一个工厂对应每一类产品,产品扩展,就意味着相应的抽象工厂也要扩展
相关文章:
4-Python与设计模式--抽象工厂模式
4-Python与设计模式–抽象工厂模式 一、快餐点餐系统 想必大家一定见过类似于麦当劳自助点餐台一类的点餐系统吧。在一个大的触摸显示屏上, 有三类可以选择的上餐品: 汉堡等主餐、小食、饮料。当我们选择好自己需要的食物,支付完成后&#…...
STM32 默认时钟更改 +debug调试
STM32时钟 文章目录 STM32时钟前言一、修改系统时钟二、DEBUG 前言 为什么我们要改STM32的时钟呢,打个比方在做SPI驱动的时候,需要16M的时钟,但是stm32默认是72的分频分不出来,这个时候我们就要改系统时钟了,那么怎么…...
转成String类型的几种方式
文章目录 1. String.valueOf()2. 包装类-toString()3. 使用字符串拼接4. 强制类型转换 (String) object5. 总结:6. 基本数据类型和包装类 1. String.valueOf() String.valueOf():基本数据类型或包装类都可以通过 String.valueOf() 方法转为字符串表示形…...
Android BSP 开发之六
1.设定Android settings中某个xml文件(包括其子项)或者某个Preference不被搜索到 设定某个xml文件(包括子项)不被搜索到 找到该xml文件对应的fragment java文件中的SEARCH_INDEX_DATA_PROVIDER,在该provider中对isPageSearchEnabled方法进行重写并…...
mybatis的使用,mybatis的实现原理,mybatis的优缺点,MyBatis缓存,MyBatis运行的原理,MyBatis的编写方式
文章目录 MyBatis简介结构图Mybatis缓存(一级缓存、二级缓存)MyBatis是什么?mybatis的实现原理JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?Mybatis优缺点优点缺点映射关系 MyBatis的解析和运行原理MyBatis的…...
Effective Modern C++(1.顶层const与底层const)
1.顶层const与底层const的定义 const修饰的变量不可以改变,那么他就是顶层const,如: const int a 10; 那么,对于 const int *const p new int(10); 第二个const就是顶层const,因为他修饰的是p;第一个…...
mmsegmentation学习笔记
mmsegmentation教程 下载预训练权重 github–>mmsegmentation–>model zoo–>XXX model(如:PSPNet)–>找到预选连权重与config的前缀一致:pspnet_r50-d8_4xb2-40k_cityscapes-512x1024 (model) 了解配置文件 查看…...
RabbitMQ简易安装
一般来说安装 RabbitMQ 之前要安装 Erlang ,可以去Erlang官网下载。接着去RabbitMQ官网下载安装包,之后解压缩即可。 Erlang官方下载地址:Downloads - Erlang/OTP RabbitMQ官方下载地址:Downloading and Installing RabbitMQ —…...
Mac M1 安装Docker打包arm64的python项目的镜像包
1、首先安装Docker,到官网下载,选择apple chip版 Docker中文网 官网 2、双击下载的dmg文件,在弹出框中之间拖拽到右边 3、打开docker,修改国内镜像源,位置在配置-DockerEngine "registry-mirrors": ["…...
『OPEN3D』1.8 点云的配准理论
点云的配准是将不同的3D点云对齐成一个完成的点云模型;配准的目标是找到两帧点云之间的相对旋转(rotation)与平移(translation),使得两份点云中有重叠的区域能够完好拼接。 点云配准示例图(来自…...
Python数据结构
目录 5.1. 列表详解 5.1.1. 用列表实现堆栈 5.1.2. 用列表实现队列 5.1.3. 列表推导式 5.1.4. 嵌套的列表推导式 5.2. del 语句 5.3. 元组和序列 5.4. 集合 5.5. 字典 5.6. 循环的技巧 5.7. 深入条件控制 5.8. 序列和其他类型的比较 本章深入讲解之前学过的一些内容…...
突发!新华三总裁《致全体员工的一封信》,中高层全面降薪10%-20%!
* 你好,我是前端队长,在职场,玩副业,文末有福利! 精彩回顾:进了央企,拿了户口,却感觉被困住了。 11月23号,某社交平台爆出了新华三总裁于英涛的《致全体员工的一封信》&a…...
QIIME 2介绍
QIIME 2(Quantitative Insights Into Microbial Ecology 2)是一个用于分析和解释微生物组数据的开源生物信息学工具。它是QIIME的第二个版本,经过重新设计以提高灵活性、可扩展性和可重复性。 1. 关于QIIME 2的一些重要特征和概念࿱…...
Spring Cloud Gateway 的简单介绍和基本使用
前言 本文主要对Spring Cloud Gateway进行简单的概念介绍,并通过多模块编程的方式进行一个简单的实操。 文章目录 前言1 什么是网关(概念)2 微服务中的网关2.1 问题12.2 问题2 3 网关作用4 Spring Cloud Gateway组成5 Spring Cloud Gateway基…...
Leaflet结合Echarts实现迁徙图
效果图如下: <!DOCTYPE html> <html><head><title>Leaflet结合Echarts4实现迁徙图</title><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0">…...
在mysql存储过程中间部分,使用游标遍历动态结果集(游标动态传参使用)
mysql游标动态传参实现(动态游标) 1.问题2.需求描述3.实现3.1.使用3.2.代码(直接看这都可以) 1.问题 众所周知,mysql存储过程功能是没有oracle的包功能强大的,但是在去O的趋势下,mysql存储过程的…...
全球SAR卫星大盘点与回波数据处理专栏目录
近年来,随着商业航天的蓬勃发展,商业SAR卫星星座成为美欧等主要航天国家的发展重点,目前已在全球范围内涌现出众多初创公司进军商业SAR领域,开始构建大规模商业微小SAR卫星星座,其所具有的创新服务能力将为传统的商业遥…...
C语言重点编程题——21-30
目录 21. 从键盘输入的10个整数中,找出第一个能被7整除的数。若找到,打印此数后退出循环;若未找到,打印"not exist" ★★★★22.有一个一维数组,内放10个学生成绩,写一个函数,求出平均分。 23.有N个学生,每个学生的信息包括学号、 性别、姓名、四门课的成绩…...
pip install 使用清华镜像源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package 官方文档: pypi | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror...
VBA技术资料MF86:将PPT文件批量另存为PDF文件
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…...
三菱PLC网口通讯避坑指南:MX Component连接上位机常见问题与解决方案
三菱PLC网口通讯实战:从MX Component配置到疑难排错全解析 在工业自动化领域,三菱PLC与上位机的稳定通讯是系统集成的基石。MX Component作为三菱官方提供的通讯组件,其网口连接方式因配置灵活、响应快速而广受工程师青睐。然而,从…...
MySQL+计算机系统的生命周期的庖丁解牛
它的本质是:理解一条 SQL 语句如何从文本字符串,经过网络协议栈、操作系统内核、文件系统、存储引擎,最终转化为磁盘磁头/闪存颗粒的物理状态变化,以及数据如何反向流动回到客户端的全过程。这不仅是数据库查询,更是 C…...
AI专著生成超实用!工具推荐与使用攻略全解析
撰写学术专著时,研究者们需要在“内容的深度”和“覆盖的广度”之间找到一个合适的平衡点,这常常成为研究者们难以逾越的瓶颈。从深度来看,AI写专著需要具备扎实的学术基础,不能仅仅掀起表面,必须清楚地解释“是什么”…...
Helm 入门:Kubernetes 的包管理工具
Helm 入门:Kubernetes 的包管理工具 在云原生技术快速发展的今天,Kubernetes 已成为容器编排的事实标准。随着应用规模的扩大,管理复杂的 Kubernetes 资源变得越来越繁琐。这时,Helm 作为 Kubernetes 的包管理工具应运而生&#…...
UR5机械臂避障实战:如何用包围盒快速过滤点云(附D435i/Kinect2配置模板)
UR5机械臂点云避障实战:包围盒滤波与多传感器适配指南 在工业自动化与机器人应用领域,UR5协作机械臂因其灵活性和安全性成为中小型工作单元的热门选择。但当机械臂需要与环境动态交互时,如何准确识别有效障碍物、过滤机械臂自身点云成为关键挑…...
ALOS DSM: Global 全球数字地表模型 (DSM) 数据集30m v4.1
目录 简介 数据集说明 空间信息 变量 代码 代码链接 结果 引用 许可 简介 ALOS World 3D - 30m (AW3D30) 是一种全球数字地表模型 (DSM) 数据集,水平分辨率约为 30 米(1 角秒网格)。该数据集基于 World 3D Topographic Data 的 DSM…...
Jenkins 学习总结投
先唠两句:参数就像餐厅点单 把API想象成一家餐厅的“后厨系统”。 ? 路径参数/dishes/{dish_id} -> 好比你要点“宫保鸡丁”这道具体的菜,它是菜单(资源路径)的一部分。查询参数/dishes?spicytrue&typeSichuan -> 好比…...
OneNET云平台数据流实战:从MQTT上传到Python查询的完整链路
1. 从零开始搭建OneNET物联网数据链路 第一次接触OneNET平台时,我被它完整的物联网数据管理能力惊艳到了。作为一个老程序员,我见过太多半吊子的物联网平台,要么协议支持不全,要么API设计反人类。而OneNET真正做到了从设备接入到数…...
乙巳马年春联生成终端快速上手:‘开门见喜’按钮背后的AI逻辑解析
乙巳马年春联生成终端快速上手:‘开门见喜’按钮背后的AI逻辑解析 1. 引言:从传统春联到AI“开门见喜” 每到新年,贴春联是家家户户的传统。但你想过没有,如果这个过程能像打开一扇门那样简单,门后就是为你量身定制的…...
Venera:打造你的跨平台漫画图书馆,告别碎片化阅读体验
Venera:打造你的跨平台漫画图书馆,告别碎片化阅读体验 【免费下载链接】venera A comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera 还在为漫画文件散落在手机、平板和电脑上而烦恼吗?是否厌倦了在不同漫画应用之间来回…...
