Python设计模式 - 简单工厂模式

定义

简单工厂模式是一种创建型设计模式,它通过一个工厂类来创建对象,而不是通过客户端直接实例化对象。

结构

在这里插入图片描述
工厂类(Factory):负责创建对象的实例。工厂类通常包含一个方法,根据输入参数的不同创建并返回不同的对象
产品类(Product):工厂类创建的对象接口或抽象类,所有具体产品类需要实现或继承这个接口或抽象类。
具体产品类(ConcreteProduct):实现了产品接口的具体类。

应用场景

  1. 多种产品对象的创建:当系统需要创建多种类型的对象(不宜过多),而且这些对象有着相似的结构或接口时,可以使用简单工厂模式来集中管理对象的创建逻辑。这有助于提高代码的可维护性和扩展性。例如,不同类型的图形对象、不同类型的报表生成器等。
  2. 避免直接实例化复杂对象:当对象的创建过程较为复杂,涉及多种初始化步骤时,可以使用简单工厂模式,将这些初始化步骤封装在工厂类中,简化客户端代码。例如,不同类型的数据库连接、复杂的对象初始化流程等。

优缺点

优点:

  1. 简化客户端代码:客户端代码不需要了解具体产品类的创建细节,只需调用工厂类的创建方法即可获得所需的对象。这减少了客户端代码的复杂性,使其更容易维护和理解。
  2. 集中管理对象的创建:对象的创建逻辑集中在工厂类中,便于统一管理和控制。这有助于在一个地方进行修改和调整,从而避免在多个地方重复修改代码,提高了代码的可维护性。
  3. 便于扩展:当需要增加新产品类时,只需在工厂类中添加相应的创建逻辑,客户端代码无需修改。这使得系统在一定程度上具有较好的扩展性。

缺点:

  1. 违背开闭原则:每当需要添加新的产品类型时,都必须修改工厂类以添加新的创建逻辑。这违反了开闭原则,增加了维护成本。
  2. 违背单一职责原则:工厂类不仅负责创建对象,还承担了对象的选择逻辑,可能会导致工厂类变得复杂,难以维护。
  3. 不可避免的条件判断:工厂类中通常会包含大量的条件判断语句(如if-else或switch-case),用于确定需要创建哪种类型的对象。这些条件判断语句会随着产品种类的增加而变得冗长且复杂。

代码示例

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def draw(self):
        pass

class Circle(Shape):
    def draw(self):
        return "Drawing a Circle"

class Rectangle(Shape):
    def draw(self):
        return "Drawing a Rectangle"

class ShapeFactory:
    @staticmethod
    def create_shape(shape_type):
        if shape_type == "CIRCLE":
            return Circle()
        elif shape_type == "RECTANGLE":
            return Rectangle()
        else:
            raise ValueError("Unknown shape type")

if __name__ == "__main__":
    # 使用工厂类创建对象
    shape = ShapeFactory.create_shape("CIRCLE")
    print(shape.draw())  # 输出: Drawing a Circle

    shape = ShapeFactory.create_shape("RECTANGLE")
    print(shape.draw())  # 输出: Drawing a Rectangle

参考

《设计模式的艺术》

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

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

相关文章

通信协议—Modbus

1、modbus简介 Modbus服务器:接收处理来自客户端的请求,并返回相应的响应; Modbus客户端:向Modbus服务器发送请求,并接收服务器返回的响应的设备或程序; 2、modbus poll调试工具下载 modbus poll用于测…

SpringCloud跨服务远程调用

随着项目的使用者越来越多,项目承担的压力也会越来越大,为了让我们的项目能服务更多的使用者,我们不得不需要把我们的单体项目拆分成多个微服务,就比如把一个商城系统拆分成用户系统,商品系统,订单系统&…

从设备匠心到啤酒体验的全方位指南

从小型手工酿酒坊到大型现代化生产线,我们在经营之前,每一套设备的选择都是基于对精酿啤酒市场需求的洞察和自身品牌的定位。无论是追求传统风味的复刻,还是创新口味的实验,设备的灵活性与可控性都是决定成品能否达到预期的关键。…

【SpringCloud】创建新工程

前言 本文使用的是jdk17,mysql8。 以下用两个服务做演示: 订单服务:提供订单ID,获取订单详细信息。 商品服务:提供商品ID,获取商品详细信息。 对于订单服务和商品服务分别建立数据库: -- 订单服…

一款不写代码的开源爬虫工具!!【送源码】

爬虫,也被称为网络爬虫或网络蜘蛛,是一种自动化的网络机器人,其主要功能是按照一定的规则,自动浏览互联网并从网页中提取信息。 作为一个开发人员,相信大家都尝试过写一些爬虫,合理的利用一些爬虫工具&…

【代码随想录】【算法训练营】【第35天】[134]加油站 [135]分发糖果 [860]柠檬水找零 [406]根据身高重建队列

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 35,连休两天~ 题目详情 [134] 加油站 题目描述 134 加油站 解题思路 前提:数组 思路:全局贪心算法:最小累加剩余汽油为负数,说明…

博客没人看啊?我分析是这些原因

1.封面 主题封面还是个性化封面?主题封面对系列化很友好,如下图左: 在目录中什么主题一目了然,个性化封面在目录中就略显杂乱。但是通过观察CSDN主页发现热榜文章清一色个性化封面。如果使文字封面就会显得很无聊。 所以从提高浏…

Orange_Pi_AIpro运行蜂鸟RISC-V仿真

Orange_Pi_AIpro运行蜂鸟RISC-V仿真 突发奇想,试一试Orange Pi AIpro上运行蜂鸟RISC-V的仿真。 准备 默认已经有一个Orange Pi AIpro,并且对设备进行一定的初始化配置,可以参考上一篇博文开源硬件初识——Orange Pi AIpro(8T&a…

零代码本地搭建AI大模型,详细教程!普通电脑也能流畅运行,中文回答速度快,回答质量高

这篇教程主要解决: 1). 有些读者朋友,电脑配置不高,比如电脑没有配置GPU显卡,还想在本地使用AI; 2). Llama3回答中文问题欠佳,想安装一个回答中文问题更强的AI大模型。 3). 想成为AI开发者,开…

运行时类型识别RTTI(typeid dynamic_cast)和虚函数机制的关系

1.typeid 2.dynamic_cast 指针类型决定了可以操作的内存范围大小 子类指针转化为父类类型的指针的一般是合法的: 父类的指针类型转化为子类类型指针,超过合法操作范围,不安全 两种转换:编译期的转换,运行时的转化 编译…

【Java】图书管理系统-控制台输出

项目原码压缩包在我主页的资源中免费领取。(在IDEA中运行,启动类在src -> Main 中运行) 图书管理系统 设计一个简单的控制台输出的图书管理系统,我们首先需要明确其基本功能、设计内容以及设计要求。这个系统可以包括以下几个…

解决Windows中端口占用导致服务启动失败

解决Windows中端口占用导致服务启动失败 在cmd窗口中使用netstat -ano | findstr "3306"来查看哪个线程占用了3306端口。 下面的图片里面表示一个pid为5196的进程占用了端口 接着可以在cmd窗口中使用tasklist | findstr "5196" 根据pid查询进程名称 通过…

LVS三种负载均衡模式:NAT、Tunneling和DR的技术对比

1. LVS-NAT 模式的特性 IP使用:RS(Real Server)应使用私有地址,RS的网关必须指向DIP(Director IP)。网络范围:DIP和RIP必须在同一个网段内。数据包处理:请求和响应报文都需要经过Di…

[DDR4] DDR1 ~ DDR4 发展史导论

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR4》 内存和硬盘是电脑的左膀右臂, 挑起存储的大梁。因为内存的存取速度超凡地快, 但内存上的数据掉电又会丢失,一直其中缓存的作用,就像是我们的工…

基于System-Verilog的FPGA设计与仿真

一、System-Verilog System Verilog的发展 SystemVerilog 的出现是为了因应日益复杂的数位电路设计和验证需求。虽然Verilog HDL 在早期的数位电路设计中得到了广泛应用,但随着技术的发展和电路复杂度的增加,Verilog HDL 在某些方面已经显得有些不足以满…

线稳源极跟随 线性电源前端降压

功率MOSFET线性电源涉及跟随.ms14 根本原理是Vgs对Id的控制,Vgs越大,Id越大,反之亦然。 观察转移特性曲线,结合接线图可知,电路稳定后,如果负载电阻增大,则Vsgnd增大,由于Vggnd有稳…

【数据挖掘】机器学习中相似性度量方法-余弦相似度

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 路虽远,行则将至&#…

在k8s上部署一个简单的应用

部署一个简单的应用 实验目标: 部署一个简单的 web 应用,比如 Nginx 或者一个自定义的 Node.js 应用。 实验步骤: 创建一个 Deployment。创建一个 Service 来暴露应用。验证应用是否可以通过 Service 访问。 今天我们来做一下昨天分享的可…

【TB作品】STM32F102C8T6单片机,PWM发生器

硬件: STM32F102C8T6核心板,按键,0.96 OLED显示屏。 软件: 1、硬件启动触发单片机输出PWM,未触发之前PWM输出为低电平。 2、按键修改PWM的变化模式、变化时间长度、占空比上下限。 3、输出的PWM是固定的10kHZ的。 4、变…

王思聪日本街头在被偶遇

王思聪日本街头再被偶遇,甜蜜约会日常成网友热议焦点近日,有网友在日本街头再次偶遇了“国民老公”王思聪,这次他不仅携带着一位美丽的女友,还展现出了两人之间亲密无间的互动,让不少网友感叹:这真的是每天…