python与设计模式之工厂模式的那些事儿

一、工厂模式
工厂模式实现了按需创建的最佳模式,其目的是为了隐藏创建类的细节与过程,通过一个统一的接口来创建所需的对象。

话说没了皇位争夺权的皇三接到了一个外征的工作,始皇给了5个亿的经费让皇三组建一个军队。打权总是要进行武器采购。

说到武器,那可以是皇大的生意,N久以前,皇大就私下建了一个简单的生产工厂,被给每条生产线设置口令。目前皇大只有三条生产线,口令分别是:"皇大威武",“皇大千秋”,“皇大万岁”对应的“刀类,矛类,枪类”

皇三这天闲来无事,来到武器店里订购由武器(刀类,矛类,枪类)等。

皇三对着一堆武器,懵逼了,不知道哪个好。这时,皇大的掌柜要求皇三提供生产口令。

import abc   # abstract class
from abc import abstractmethod
class Product(metaclass=abc.ABCMeta):#拿到生产武器的生产资质及技术@abstractmethoddef fabricate(): #定义能够生产武器的方法pass
#引进刀类,矛类,枪类的生产线
class ProductBittool(Product):#刀类生产线def fabricate(self):#生产工艺print("我是刀类生产线,正在生产刀具")class ProductSpear(Product):#mao矛类生产线def fabricate(self):#生产工艺print("我是矛类生产线,正在生产矛具")class ProductGun(Product):#刀类生产线def fabricate(self):#生产工艺print("我是枪类生产线,正在生产枪具")class SimpleFactory():def create_product(product_type):if product_type == "HDWW":return ProductBittool()elif product_type == "HDQQ": return ProductSpear() elif product_type == "HDWS": return ProductGun() else: print('你的要求非法,我们不能提供')product_a = SimpleFactory.create_product("HDWW")
product_b = SimpleFactory.create_product("HDQQ") 
product_c = SimpleFactory.create_product("CLQQ") 
print("======我是有底线的======")
product_a.fabricate()
product_b.fabricate()
---------------------------------------------------------------------
你的要求非法,我们不能提供
======我是有底线的======
我是刀类生产线,正在生产刀具
我是矛类生产线,正在生产矛具

当皇三把第三个口令改成“HDMZ--皇大混账”时,想购买的枪类武器就被拒绝。由于皇大早期建的武器工厂的只是“简单的工厂模式”,并没有考虑到后期武器的发展,缺乏战略目光,更多高科技武器快速发展,但是皇大却只能在主工厂生产,没有分厂建设能力。这相当不利于新的高科技武器开发,目前所有新增加的武器都得对简单工厂(SimpleFactory())进行改造,并要求客户提供正常的口令才能实现生产,极其不方便。

为了解决这个行来痛点,皇大组织了N次头脑风暴,并放下狠话来,要是没有想到新的方法,谁也不许回家睡觉。大家真的是急得像热锅上的蚂蚁,这时皇大手下的一位掌故就想出来一个法子。他建议把生产权力下放,让分厂拥有接单能力,总厂只负责生产工艺。武器的生产则由生产部指导,生产订单则由分厂接,并向总厂申请生产工艺与技术。这样每当有新的高科技武器需求,就开辟一条新的生产线,同时为这条新生产线建造一个生产车间。总厂负责调度工艺文件,生产部门负责下达生产任务。此问题不就解决了。只要有新的武器需求,我们就开辟新生产车间,同时下达新的生产任务,这样就不用每次需求变更就都要整改总厂了。我们也不需要口令了,而且无论是什么样的需求,只要是生产让每个武器的掌柜去接单就可以生产了。

import abc 
class Product(metaclass=abc.ABCMeta):#拿到生产武器的生产资质及技术@abstractmethoddef fabricate(): #定义能够生产武器的方法pass#引进刀类,矛类,枪类的生产线
class ProductBittool(Product):#刀类生产线def fabricate(self):#生产工艺print("我是刀类生产线,正在生产刀具")class ProductSpear(Product):#mao矛类生产线def fabricate(self):#生产工艺print("我是矛类生产线,正在生产矛具")class ProductGun(Product):#刀类生产线def fabricate(self):#生产工艺print("我是枪类生产线,正在生产枪具")#开武器店接单,不然那些工人不造反才怪,现在的已经下滑,日子真提无法过了,快点来点单子吧。工厂接单子
class Creator(metaclass=abc.ABCMeta):#工厂接订单@abstractmethoddef factory_method(self):#接单根据定制要求,给定订分配生产线,比如要求生产刀类,则传入刀类生产线ProductBittool()passdef some_operation(self):#产生要求生产的需求product = self.factory_method()product.fabricate()#具体生产过程class CreatorBittool(Creator):#刀类掌柜def factory_method(self):#接单return ProductBittool()#下单生产刀类class CreatorSpear(Creator):#矛类掌柜def factory_method(self):#接单return ProductSpear()#下单生产矛具class CreatorGun(Creator):#刀类掌柜def factory_method(self):#接单return ProductGun()#下单生产枪具
#开始疑惑,掌柜接单后只需要告诉生产就好了,为何还要经过工厂呢,因为掌柜没有生产工艺,只有工厂有。bittool = CreatorBittool()
bittool.some_operation()
spear = CreatorSpear()
spear.some_operation()
gun = CreatorGun()
gun.some_operation()-------------------------------------------------------
我是刀类生产线,正在生产刀具
我是矛类生产线,正在生产矛具
我是枪类生产线,正在生产枪具

皇三:听说皇大的武器工厂最能升级了功能,我来去试试看,“掌柜的,宝塔镇河妖,皇大威武”。

掌柜:“三皇子,现在我们系统已经升级了,已经不再需要口令了,你需要哪种武器,每种武器前面都有分掌柜,只需要跟他们提要求就好了。如果他们无法满足你,我们皇大也会专门您开辟新的武器研究的,谁叫我们都是为皇家而战呢。”从此以后,皇三再也不用直接去记住口令了。只需要找分掌故提要求就好了。皇三再逛店的时候就变成了这样了。终于可以友好只要动动嘴就行了,

以上是对工厂模式的浅浅理解。

总结一下,就是生产跟需求解偶,为什么要有Product()这个抽像类,理解是抽像共同的东西,你是个生产武器的的产品,虽然有不同的生产品要求,都要有共同的标准,粗理解就是行业要求,总不能你是武器工厂,然后来来生产内衣吧,就算开辟一条特例生产线,也不像话。有了Product()这个类,那么你要生产的产品就都会是一样的,生产武器就是武器,内衣就是内衣。ProductBittool(Product)这些子类就是基于Product这个类的要求来生产产品,这样你要生产什么武器就创建这个什么样的生产线。这就是生产部门决定的。

那跟工厂有什么关系

Creator()这个抽像类,我理解是总公司定义了一个接单功能,然后又不能直接去接单。就像背后的大佬一样,让分公司(棋子,永远不知道棋手后面是什么)去接。CreatorBittool(Creator),这个就像棋子去执行接单子任务,然后记录你所要接武器属于哪一条生产线,然后接到单子了,就用使用总厂提供的方法上报给总厂生产部门,生产部门就调用指定的生产线生产任务。

这样做了,就跟总厂没有任何关系了,总厂只做指导意见与中转,这样就解偶了订单需求跟生产直接绑定了。订单不用关心生产要使用哪条生产线,只要把我的需求准确生产出来就好,我不管你是使用什么技术生产的,也不用关心生产线在哪个地方。彻底的当起了甩手掌柜了。

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

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

相关文章

【Java开发指南 | 第二篇】标识符、Java关键字及注释

读者可订阅专栏:Java开发指南 |【CSDN秋说】 文章目录 标识符Java关键字Java注释 标识符 Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。 所有的标识符都应该以字母(A-Z 或者 a-z),美元符($&#xff0…

CentOS 7安装、卸载MySQL数据库

说明:本文介绍如何在CentOS 7操作系统下使用yum方式安装MySQL数据库,及卸载; 安装 Step1:卸载mariadb 敲下面的命令,查看系统mariadb软件包 rpm -qa|grep mariadb跳出mariadb软件包信息后,敲下面的命令…

【Qt】:事件的处理

系统相关 一.鼠标事件二.键盘事件三.定时器 事件是应用程序内部或者外部产生的事情或者动作的统称。在Qt中使用一个对象来表示一个事件。所有的Qt事件均继承于抽象类QEvent。事件是由系统或者Qt平台本身在个同的的刻友出的。当用广投下鼠标、敲下键盘,或者是窗口需要…

第四百六十二回

文章目录 1. 概念介绍2. 实现方法3. 示例代码4. 内容总结 我们在上一章回中介绍了"关于MediaQuery的优化"相关的内容,本章回中将介绍readMore这个三方包.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的readMore是一个…

【团体程序设计天梯赛 往年关键真题 25分题合集 详细分析完整AC代码】(L2-001 - L2-024)搞懂了赛场上拿下就稳了

L2-001 紧急救援 最短路路径打印 样例 输入1 4 5 0 3 20 30 40 10 0 1 1 1 3 2 0 3 3 0 2 2 2 3 2输出1 2 60 0 1 3分析 用一遍dijkstra算法。设立 n u m [ i ] num[i] num[i]和 w [ i ] w[i] w[i]表示从出发点到i结点拥有的路的条数,以及能够找到的救援队的数目…

Websocket (帧格式, 握手过程, Spring 中使用 WebScoket 协议)

什么是 WebSocket 客户端 A 和客户端 B 的消息传播需要借助服务器的中转 (原因是内网不能给另一个局域网的内网直接联通, 需要借助服务器的外网做 “中介”) (NAT 地址转换) Http 协议 不支持实时通讯 (或者说不支持服务器主动推送数据给客户端) TCP 本身是具有服务器推送数据这…

【verilog】 reg与寄存器的关系

一、前言 在Verilog中经常用reg定义具有数据寄存功能的单元,但在verilog的使用中,并不代表其一定就是寄存单元,reg还能进行组合逻辑描述,并且在一些场景下,只能使用reg来申明变量。 二、reg型变量生成组合逻辑 在Ve…

linux shell脚本编写(2)

Shell: 命令转换器,高级语言转换成二进制语言。是Linux的一个外壳,它包在Lniux内核的外面,用户和内核之间的交互提供了一个接口。 内置命令:在shell内部不需要shell编辑 外置命令:高级语言要用shell转换成二进制语言 …

(一)Jetpack Compose 从入门到会写

基本概念 Compose 名称由来 众所周知,继承在功能拓展上表现的很脆弱,容易类、函数爆炸,通过代理和包装进行组合会更健壮。 Compose 意为组合,使用上也是把 Compose 函数以 模拟函数调用层级关系的方式 组合到一起,最终…

PCL中VTK场景添加坐标系轴显示

引言 世上本没有坐标系,用的人多了,便定义了坐标系统用来定位。地理坐标系统用于定位地球上的位置,PCL点云库可视化窗口中的坐标系统用于定位其三维世界中的位置。本人刚开始接触学习PCL点云库,计算机图形学基础为零,…

基于Python的卷积网络的车牌识别系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

leetcode不同路径

. - 力扣(LeetCode) 62. 不同路径 中等 相关标签 相关企业 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下…

04_UART串口发送数据

1.配置芯片,如果PA9,PA10的UART引脚被占用,会自动进行重映射 2.代码 int main(void) {uint8_t temp[]"test";/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*…

Unity Shader 流光 边缘光

前言 Unity2021.3.23 一、实现原理 Time控制UV的变化,再采样一张流光贴图.即可实现流光效果。 二、效果及源码展示 1.流光效果 效果描述: 1.边缘光(菲尼尔), 2.从上到下扫描光. 效果图如下: 代码如下: Shader "Unlit/ScanCode" {Properties{_MainTex ("T…

JavaEE企业开发新技术5

目录 2.18 综合应用-1 2.19 综合应用-2 2.20 综合应用-3 2.21 综合应用-4 2.22 综合应用-5 Synchronized : 2.18 综合应用-1 反射的高级应用 DAO开发中,实体类对应DAO的实现类中有很多方法的代码具有高度相似性,为了提供代码的复用性,降低…

MoneyPrinterTurbo-利用AI大模型,一键生成高清短视频

MoneyPrinterTurbo-利用AI大模型,一键生成高清短视频 在今天的信息爆炸的时代,短视频已经成为最受欢迎的信息传递方式之一。无论是分享生活瞬间,还是传递重要信息,短视频都是最直观,最具影响力的手段。但是&#xff0…

微软 SDL 安全研发生命周期详解

微软SDL(Security Development Lifecycle)是一种安全软件开发的方法论,它强调在整个产品开发过程中融入安全考虑因素。SDL 是一个动态的过程,包括多个阶段和活动,以确保产品的安全开发、测试、部署和运行。Microsoft 要…

11.哀家要长脑子了!

目录 1.453. 最小操作次数使数组元素相等 - 力扣(LeetCode) 2.665. 非递减数列 - 力扣(LeetCode) 3. 283. 移动零 - 力扣(LeetCode) 4. 3114. 替换字符可以得到的最晚时间 - 力扣(LeetCode…

说说我理解的数据库中的Schema吧

一、SQL标准对schema如何定义? ISO/IEC 9075-1 SQL标准中将schema定义为描述符的持久命名集合(a persistent, named collection of descriptors)。 大部分的网上资料定义Schema如下: schema是用来组织和管理数据的一种方式。它…

对中小企业来说,一次的勒索事件有可能造成致命的伤害

勒索攻击越来越频繁 去年的勒索事件数据呈现出显著的增长趋势。具体来说,全球范围内的勒索软件攻击活动愈演愈烈,受害者数量创下历史新高,同比增长了46%。 例如,2023年伊始,英国皇家邮政成为了勒索团伙LockBit的大型…