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

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

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

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

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

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

import abc   # abstract class
from abc import abstractmethod
class Product(metaclass=abc.ABCMeta):#拿到生产武器的生产资质及技术
    @abstractmethod
    def 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):#拿到生产武器的生产资质及技术
    @abstractmethod
    def 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):#工厂接订单
    @abstractmethod
    def factory_method(self):#接单根据定制要求,给定订分配生产线,比如要求生产刀类,则传入刀类生产线ProductBittool()
        pass
    def 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()

-------------------------------------------------------
我是刀类生产线,正在生产刀具
我是矛类生产线,正在生产矛具
我是枪类生产线,正在生产枪具

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ClickHouse--16--普通函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、日期函数1、时间或日期截取函数(返回非日期)2、时间或日期截取函数(返回日期)3、日期或时间日期生成函数 二、类…

httpsok-快速申请谷歌SSL免费证书

🔥httpsok-快速申请谷歌SSL免费证书 使用场景: 部署CDN证书、OSS云存储证书证书类型: 单域名 多域名 通配符域名 混合域名证书厂商: ZeroSSL Lets Encrypt Google证书加密类型: ECC、 RSA 一、证书管理 进入 证书管…

基于Python的LSTM网络实现单特征预测回归任务(pytorch版)

一、数据集 自建数据集--【load.xlsx】。包含2列: date列(时间列,记录2022年6月2日起始至2023年12月31日为止,日度数据)price列(价格列,记录日度数据对应的某品牌衣服的价格,浮点数…

uni-app实现下拉刷新

业务逻辑如下: 1.在滚动容器中加入refresher-enabled属性,表示为开启下拉刷新 2.监听事件,添加refresherrefresh事件 3.在事件监听函数中加载数据 4.关闭动画,添加refresher-triggered属性,在数据请求前开启刷新动画…

戴尔 latitude 3490使用体验

最近体验了一下戴尔 latitude 3490,又体验了一下戴尔 latitude 3420.再把戴尔最近的主流轻薄本、当下主流轻薄本做对比. 感觉3490比3420好用,要流畅一些,但是有点重,整体设计感不如3420。 戴尔 Latitude 14 3000系列 3490(i5 82…

代码随想录算法训练营Day53|LC1143 最长公共子序列LC1035 不相交的线LC53 最大子数组和

一句话总结:秒了。 原题链接:1143 最长公共子序列 与昨天的最长重复子数组极度类似。 由于这里是子序列,两者不相等时有dp[i][j] Math.max(dp[i][j - 1], dp[i - 1][j])。同时由于子序列的缘故,dp数组及下标的含义也有了改变&am…

根据后端获取到的文档流,下载打开显示“无法打开文件”

原代码: download(item) {this.axios.get(api.download/item.name).then(res > {// console.log(res)let bob new Blob([res.data],{type: application/vnd.ms-excel})const link document.createElement(a);let url window.URL.createObjectURL(bob);link.d…

3D应用模型信创系统实时渲染有什么要求?

实时云渲染技术是数字孪生领域,比较常用的轻量化软件交付方式,该技术是将3D应用等大模型的算力执行放在了服务器端,而服务器目前比较常用的还是Windows系统。但随着国产信创在数字孪生领域应用越来越多,实时云渲染平台的国产信创化…

力扣刷题 二叉树层序遍历相关题目II

NO.116 填充每个节点的下一个右侧节点指针 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,…

NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估

目录 一、说明 二、Deepset SQUAD是个啥? 三、问答系统(QA系统),QA系统在各行业的应用及基本原理 3.1 医疗 3.2 金融 3.3 顾客服务 3.4 教育 3.5 制造业 3.6 法律 3.7 媒体 3.8 政府 四、在不同行业使用QA系统的基本原理 五、关于…

QThread的学习

锁住该线程直到下面的情况之一出现: (1)和该线程连接的对象已经执行完成(例如:当它从run()中返回时) 如果该线程已经结束,该函数将返回true。 如果该线程还没有开始,它也返回true。 (2)time毫秒已经过去。如…

迁移docker部署的GitLab

目录 1. 背景2. 参考3. 环境4. 过程4.1 查看原docker启动命令4.2 打包挂载目录传至新宿主机并创建对应目录4.3 保存镜像并传至新宿主机下4.4 新宿主机启动GitLab容器 5 故障5.1 容器不断重启5.2 权限拒绝5.3 容器内错误日志 6 重启容器服务正常7 总结 1. 背景 最近接到一个任务…

数组算法——查询位置

需求 思路 使用二分查找找到第一个值,以第一个值作为界限,分为左右两个区间在左右两个区间分别使用二分查找找左边的7,:找到中间位置的7之后,将中间位置的7作为结束位置,依次循环查找,知道start>end,返回…

蓝桥杯 每天2题 day6

碎碎念:哇咔咔 要不是中间缺勤一天就圆满day7了!最后一晚上!写题复习哇咔咔 唉,睡了一觉就看不下去了,,,看看之前的笔记洗洗睡觉,,, 记得打印准考证带好东西…

TripoSR: Fast 3D Object Reconstruction from a Single Image 论文阅读

1 Abstract TripoSR的核心是一个基于变换器的架构,专为单图像3D重建设计。它接受单张RGB图像作为输入,并输出图像中物体的3D表示。TripoSR的核心包括:图像编码器、图像到三平面解码器和基于三平面的神经辐射场(NeRF)。…

算法打卡day34

今日任务: 1)62.不同路径 2)63.不同路径 II 3)复习day10 62.不同路径 题目链接:62. 不同路径 - 力扣(LeetCode) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “S…

Harmony鸿蒙南向驱动开发-UART接口使用

功能简介 UART指异步收发传输器(Universal Asynchronous Receiver/Transmitter),是通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输。 两个UART设备的连接示意图如下,UART与其他模块一…

【拓展技术】——AutoDL服务器训练Pycharm使用注意点Pycharm配置AutoDL

一、AutoDL服务器模型训练 AutoDL是一个为研究人员、开发者和企业提供的平台,它致力于提供一个高效、可靠和易用的环境,以支持复杂的计算任务和AI模型的部署: 高效的并行计算资源:AutoDL拥有强大的计算集群和高性能的计算节点&a…

自定义协议:序列化与反序列化的深度解析与实践

⭐小白苦学IT的博客主页⭐ ⭐初学者必看:Linux操作系统入门⭐ ⭐代码仓库:Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统 1.引言 协议是一种 "约定". socket api的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的. 如…

代码随想录--数组--长度最小的子数组

题目 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。 示例: 输入:s 7, nums [2,3,1,2,4,3] 输出&#…