【Python笔记-设计模式】工厂模式

一、说明

(一) 解决问题

提供了一种方式,在不指定具体类将要创建的情况下,将类的实例化操作延迟到子类中完成。可以实现客户端代码与具体类实现之间的解耦,使得系统更加灵活、可扩展和可维护。

(二) 使用场景

  • 希望复用现有对象来节省系统资源, 而不是每次都重新创建对象时
  • 如果无法预知对象确切类别及其依赖关系时
  • 希望用户能扩展你软件库或框架的内部组件时

二、结构

  1. 产品 (Product) 将会对接口进行声明。 对于所有由创建者及其子类构建的对象, 这些接口都是通用的。
  2. 具体产品 (Concrete Products) 是产品接口的不同实现。
  3. 创建者 (Creator) 类声明返回产品对象的工厂方法。 该方法的返回对象类型必须与产品接口相匹配。你可以将工厂方法声明为抽象方法, 强制要求每个子类以不同方式实现该方法。 或者, 你也可以在基础工厂方法中返回默认产品类型。注意, 尽管它的名字是创建者, 但它最主要的职责并不是创建产品。 一般来说, 创建者类包含一些与产品相关的核心业务逻辑。 工厂方法将这些逻辑处理从具体产品类中分离出来。 打个比方, 大型软件开发公司拥有程序员培训部门。 但是, 这些公司的主要工作还是编写代码, 而非生产程序员。
  4. 具体创建者 (Concrete Creators) 将会重写基础工厂方法, 使其返回不同类型的产品。注意, 并不一定每次调用工厂方法都会创建新的实例。 工厂方法也可以返回缓存、 对象池或其他来源的已有对象。

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
工厂模式
将类的实例化操作延迟到子类中完成例:通过传入不同的操作符,实现对两个数字的加减乘除运算
"""from abc import ABC, abstractmethodclass Product(ABC):"""抽象基类"""num1 = Nonenum2 = None@abstractmethoddef get_result(self):passclass ProductAdd(Product):"""具体产品类(加)"""def get_result(self):return self.num1 + self.num2class ProductSub(Product):"""具体产品类(减)"""def get_result(self):return self.num1 - self.num2class ProductMul(Product):"""具体产品类(乘)"""def get_result(self):return self.num1 * self.num2class ProductDiv(Product):"""具体产品类(除)"""def get_result(self):return self.num1 / self.num2class ProductErr(Product):"""具体产品类(错误)"""def get_result(self):print("error")return 0class Factory:"""工厂类"""operation = {"+": ProductAdd(), "-": ProductSub(), "*": ProductMul(), "/": ProductDiv()}def create_product(self, ch):if ch in self.operation:op = self.operation[ch]else:op = ProductErr()return opif __name__ == "__main__":"""num1: 1num2: 2ch: +3.0"""num1 = float(input("num1: "))num2 = float(input("num2: "))ch = input("ch: ")factory = Factory()product = factory.create_product(ch)product.num1 = num1product.num2 = num2print(product.get_result())

四、优缺点

优点

  • 你可以避免创建者和具体产品之间的紧密耦合。
  • 单一职责原则。你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护。
  • 开闭原则。无需更改现有客户端代码, 你就可以在程序中引入新的产品类型。

缺点

  • 应用工厂方法模式需要引入许多新的子类,代码可能会因此变得更复杂。最好的情况是将该模式引入创建者类的现有层次结构中。

 跳转主页:【Python笔记】设计模式-CSDN博客

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

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

相关文章

Maven depoly:Skipping artifact deployment

问题描述: 使用IDEA执行mvn depoly将本地开发的模块发布到Maven私服时,一直提示:Skipping artifact deployment,自动跳过了depoly部署阶段。 问题分析 Maven构建生命周期中的每一个阶段都是由对应的maven插件执行具体工作的。既然…

使用IDEA创建spring boot web项目并测试运行

文章目录 准备工作构建项目1、通过Maven Archetype构建一个webapp项目2、添加 Spring Boot 所需依赖3、创建配置文件4、创建启动类5、创建web api 接口6、测试web api接口 准备工作 idea下载地址: https://www.jetbrains.com/idea/download/?sectionwindows java下…

关于torch.cuda.is_available() 返回False 详细说明及解决

一 cuda 环境检测失败 cuda 环境检测代码: import torchprint(torch.__version__) print(torch.cuda.is_available()) print(torch.version.cuda) cuda 环境检测代码执行结果如下图: 关键代码print(torch.cuda.is_available()) 返回 False 通常表示当…

java.lang.IllegalStateException: Promise already completed.

spark submit 提交作业的时候提示Promise already complete 完整日志如下 File "/data5/hadoop/yarn/local/usercache/processuser/appcache/application_1706192609294_136972/container_e41_1706192609294_136972_02_000001/py4j-0.10.6-src.zip/py4j/protocol.py"…

Draw.io绘制UML图教程

一、draw.io介绍 1、draw.io简介 draw.io 是一款强大的免费在线图表绘制工具,支持创建流程图、组织结构图、时序图等多种图表类型。它提供丰富的形状库、强大的文本编辑和样式设置功能,使用户能够轻松创建专业级图表。draw.io 具有用户友好的界面&…

LeetCode 热题 100 | 二叉树(终)

目录 1 二叉树小结 1.1 模式一 1.2 模式二 2 236. 二叉树的最近公共祖先 3 124. 二叉树中的最大路径和 菜鸟做题(返校版),语言是 C 1 二叉树小结 菜鸟碎碎念 通过对二叉树的练习,我对 “递归” 有了一些肤浅的理解。…

【激光SLAM】基于滤波的激光SLAM方法(Grid-based)

Filter-based SLAM 贝叶斯滤波数学概念贝叶斯滤波特性贝叶斯滤波的推导 粒子滤波(Particle filter)特性流程状态传播权重评估重采样算法流程存在的问题 FastSLAM的原理及优化FastSLAM介绍算法流程FastSLAM优化存在的问题及优化进一步优化proposal分布最终…

RabbitMQ学习整理————基于RabbitMQ实现RPC

基于RabbitMQ实现RPC 前言什么是RPCRabbitMQ如何实现RPCRPC简单示例通过Spring AMQP实现RPC 前言 这边参考了RabbitMQ的官网,想整理一篇关于RabbitMQ实现RPC调用的博客,打算把两种实现RPC调用的都整理一下,一个是使用官方提供的一个Java cli…

思维模型整合

思维模型整合 4P--- 4C思考模型能力圈模型 4P— 4C思考模型 在竞争激烈的今天,每个赛道都有众多可以为客户提供相同价值的对手,而赛道中的佼佼者之所以能打败大部分人,可能并不是他们能比别人更能讨好大众,而是因为在这个赛道它有…

Jmeter学习系列之六:阶梯加压线程组Stepping Thread Group详解

性能测试中,有时需要模拟一种实际生产中经常出现的情况,即:从某个值开始不断增加压力,直至达到某个值,然后持续运行一段时间。 在jmeter中,有这样一个插件,可以帮我们实现这个功能,这个插件就是:Stepping Thread Group 1、下载配置方法 1.1.下载配置 插件下载地址:…

Selenium定位不到元素怎么办?一定要这么做

在使用Selenium进行自动化测试时,碰到无法定位元素该怎么办?这里总结了9种情况下的元素定位方法: 1、frame/iframe表单嵌套 WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌的页面元素无法直接定位。 解决…

Jenkins持续集成Python项目

一、前言   之前学习了很多自动化测试框架,但是写的脚本都是本地执行,多数用来造数据。最近公司掀起一股自动化测试的风,所以就想研究下如何集成jenkins,本次采用pytest,用的是阿里云服务器centos7。 二、服务器环境…

石头剪刀布游戏(C语言)

题目描述 石头剪刀布游戏有 3 种出拳形状:石头、剪刀、布。分别用字母 A , B , C 表示。 游戏规则: 出拳形状之间的胜负规则如下: A > B;B > C;C > A;">"左边一个字母,表示相对优…

bat 查找文件所在

脚本 在批处理文件(.bat)中查找文件所在的目录,你可以使用dir命令结合循环和条件语句来实现。以下是一个简单的示例,演示如何在批处理文件中查找指定文件并输出其所在目录: echo off setlocal enabledelayedexpansio…

Vue 封装的 axios 类的使用(小bug 改进)

http类 import { baseUrl } from "./config"; //引入config.js中的配置 import axios from "axios"; //引入axios import qs from "querystringify"; //form-Data请求时的工具类class Http{axios null;lastRequestIntercept null…

开源LLMs导览:工作原理、顶级LLM列表对比

目录 一、开源 LLM 是什么意思?二、开源LLM如何工作?2.1 预训练2.2 代币化2.3 开源LLM的微调2.4 输入编码2.5 训练与优化2.6 推理 三、开源LLM对组织的好处3.1 增强的数据安全和隐私3.2 节约成本3.3 减少供应商依赖性3.4 代码透明度 四、哪种LLM模式最好…

数据可视化在商业领域有哪些重要性?

数据可视化在商业领域的重要性体现在多个方面,它通过将复杂的数据集转化为直观、易于理解的图形和图表,帮助企业和组织做出更明智的决策。以下是数据可视化对商业的一些关键重要性: 提高决策效率:通过直观的图表和图形&#xff0c…

漫漫数学之旅031

文章目录 经典格言数学习题古今评注名人小传 - 经典格言 如果没有数学知识,这个世界的事物是无法搞清楚的。——罗杰培根(Roger Bacon) 好的,各位看官,让我们来听听罗杰培根这位中世纪的“科学老顽童”是怎么说的&…

罗克韦尔AB的PLC实现ModbusTCP和ModbusRTU协议标签方式通讯

本文是通过IGT-DSER智能网关读写AB罗克韦尔Compact、Control系列PLC的标签数据缓存并转为Modbus从站协议,与上位机通讯的案例。 打开智能网关的参数软件(下载地址),通过功能->数据转发与平台对接,再选择数据转发与缓存’,进入以…

基于java+springboot+vue实现的城市垃圾分类管理系统(文末源码+Lw)23-191

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本城市垃圾分类管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数…