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

news2024/11/28 20:35:46

一、说明

(一) 解决问题

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

(二) 使用场景

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

二、结构

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

三、伪代码

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
__doc__ = """
工厂模式
将类的实例化操作延迟到子类中完成

例:通过传入不同的操作符,实现对两个数字的加减乘除运算
"""

from abc import ABC, abstractmethod


class Product(ABC):
    """
    抽象基类
    """
    num1 = None
    num2 = None

    @abstractmethod
    def get_result(self):
        pass


class ProductAdd(Product):
    """
    具体产品类(加)
    """

    def get_result(self):
        return self.num1 + self.num2


class ProductSub(Product):
    """
    具体产品类(减)
    """

    def get_result(self):
        return self.num1 - self.num2


class ProductMul(Product):
    """
    具体产品类(乘)
    """

    def get_result(self):
        return self.num1 * self.num2


class ProductDiv(Product):
    """
    具体产品类(除)
    """

    def get_result(self):
        return self.num1 / self.num2


class ProductErr(Product):
    """
    具体产品类(错误)
    """

    def get_result(self):
        print("error")
        return 0


class Factory:
    """
    工厂类
    """
    operation = {"+": ProductAdd(), "-": ProductSub(), "*": ProductMul(), "/": ProductDiv()}

    def create_product(self, ch):
        if ch in self.operation:
            op = self.operation[ch]
        else:
            op = ProductErr()
        return op


if __name__ == "__main__":
    """
    num1: 1
    num2: 2
    ch: +
    3.0
    """
    num1 = float(input("num1: "))
    num2 = float(input("num2: "))
    ch = input("ch: ")

    factory = Factory()
    product = factory.create_product(ch)
    product.num1 = num1
    product.num2 = num2
    print(product.get_result())

四、优缺点

优点

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

缺点

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

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

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

相关文章

怎样连接局域网?

局域网(Local Area Network,缩写为LAN)是建立在小范围内的计算机网络,用于连接同一建筑物或者办公场所内的设备。连接局域网可以实现设备之间的信息共享和远程通信。本文将介绍如何连接局域网,并介绍了天联组网天联的使…

unity学习(15)——服务器组装(1)

1.新建好的c#项目如下: 文件夹中内容如下: 此时已经可以通过vs2022打开.sln文件,就可以打开项目了。 2.我们把逆向后(主程序)的内容的代码粘贴过去。有些逆向功底,很快可以定位到,服务器的入口…

强国有我社会实践公益活动在合肥市庐阳区开展

2月18日是开工第一天,阳光灿烂、春光明媚。合肥市四十五中2022级星辰(5)班部分同学在监护人的陪伴下来到庐阳区双岗街道万小店社区残疾人工作站,和工作站兄弟姐妹们共同开展“强国复兴有我”社会实践公益活动。合肥市庐阳区为民社…

基于JavaWeb开发的小区车辆登记系统计算机毕设[附源码]

基于JavaWeb开发的小区车辆登记系统计算机毕设[附源码] 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统…

C++ bfs反向建图(六十)【第七篇】

今天我们来学习一下bfs反向建图 1.bfs的反向建图 我们之前在图上求最短路都是求从起点出发到每个点的最短路,不过有时候我们也会遇到让求每个点到终点的最短路的问题,此时我们可以怎么做呢? 如果从每个点出发,用 BFS 搜索到终点…

基于JavaWeb开发的羽毛球管理系统计算机毕业设计[附源码]

基于JavaWeb开发的羽毛球管理系统计算机毕业设计[附源码] 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系…

Linux环境安装Maven(详细图文)

目录 摘要 一、准备工作 1.检查当前环境是否安装maven 2.下载maven ​3.上传maven压缩包 4.解压maven包 5.移动到/usr/local目录下方便管理 6.配置maven环境变量 7.刷新配置文件 8.配置maven镜像仓库 9.验证是否成功 摘要 笔者Linux环境为:Ubuntu 22.04 …

C#上位机与三菱PLC的通信07--使用第3方通讯库读写数据

1、通讯库介绍 mcprotocol 是一个基于 Node.js 的三菱 PLC MC 协议通信库,具有以下特点: 支持多种三菱 PLC MC 协议的设备,如 FX3U、Q03UDECPU、QJ71E71 等。 支持多种功能码和数据类型,如读取线圈(M)、…

Yii2项目使用composer异常记录

问题描述 在yii2项目中,使用require命令安装依赖时,出现如下错误提示 该提示意思是:composer运行时,执行了yiisoft/yii2-composer目录下的插件,但是该插件使用的API版本是1.0,但是当前的cmposer版本提供的…

【JVM篇】什么是类加载器,有哪些常见的类加载器

文章目录 🍔什么是类加载器🛸有哪些常见的类加载器 🍔什么是类加载器 负责在类加载过程中,将字节码信息以流的方式获取并加载到内存当中 🛸有哪些常见的类加载器 启动类加载器 启动类加载器是有Hotspot虚拟机通过的类…

一文了解Web3.0真实社交先驱ERA

Web2时代,少数科技巨头垄断了全球近60亿人口的网络社交数据,并用之为自己牟利,用户无法掌控个人数据,打破该局面逐渐成为共识,于是,不少人看到了Web3社交赛道蕴含的巨大机遇,标榜着去中心化和抗…

官网域名SSL证书的重要性

什么是SSL证书? SSL(安全套接层)证书是一种加密技术,用于确保在用户浏览网站时,其数据传输经过安全通道,不能被第三方窃取或篡改。通过SSL证书,网站可以建立安全连接,保障用户与网站…

阿里云学生300元无门槛代金券领取入口,2024更新

阿里云300元无门槛代金券怎么领取?300元无门槛代金券是指阿里云的「云工开物」高校计划,学生完成实名认证即可领取300元无门槛优惠券,活动入口 aliyunbaike.com/go/university 活动的打开后,如下图: 阿里云学生代金券…

【自然语言处理】:实验4布置,预训练语言模型实现与应用

清华大学驭风计划 因为篇幅原因实验答案分开上传,自然语言处理专栏持续更新中,期待的小伙伴敬请关注 有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~ 案例简介 2018年,Google提出了预训练语言模型BE…

甲醇汽车产量不断增加 行业发展面临一定困难和挑战

甲醇汽车产量不断增加 行业发展面临一定困难和挑战 甲醇汽车是指以甲醇作为主要或者唯一燃料的汽车。与传统汽车相比,甲醇汽车具有节能减排、使用成本低、有害气体排放量少等优点,能够有效缓解能源紧缺及环境污染问题。 从上游市场来看,甲醇…

策略联动配置

策略联动简介 定义 策略联动是通过在网关设备上统一管理用户的访问策略并且在网关设备和认证接入设备执行用户的访问策略,来解决大型园区策略强度与复杂度之间矛盾的一种解决方案。 目的 传统网络中,在接入层部署NAC认证,使得认证接入设备…

在ChatGPT时代,出国留学如何避免掉入学术不端重灾区?

近日,哈佛校长克洛迪娜盖伊在校园“反犹风波”中因立场问题被迫辞职。此外,哈佛大学相关调查委员会还发现盖伊在学术论文中存在错误引用资料来源等问题。对于种种学术不端行为,留学生如何防范?在ChatGPT时代,出国留学如…

ktutil编写生成keytab文件的脚本、通过keytab文件认证用户

文章目录 1. 生成keytab文件脚本2. 通过keytab文件认证3. 查看认证的用户4. 失效认证的用户 1. 生成keytab文件脚本 生成keytab文件的脚本 vim generate_kb.sh #!/usr/bin/bash ktutil <<EOF add_entry -password -p $1 -k 1 -e arcfour-hmac $2 write_kt $3 EOF示例&am…

项目管理工具YouTrack v2023.3全新发布——支持一系列AI辅助功能

YouTrack 是一款项目管理工具&#xff0c;其中包含可以简化您的工作并在任何团队项目中提高生产力的功能。从软件开发和 DevOps 到人力资源和市场营销&#xff0c;各种团队都可以使用 YouTrack 的功能轻松跟踪和协作处理任何规模的项目。 YouTrack v2023.3正式版下载 具体更新…

【刷题记录】移除链表元素

本系列博客为个人刷题思路分享&#xff0c;有需要借鉴即可。 注&#xff1a;部分思路借鉴自程序员小熊 链接&#xff1a;https://leetcode.cn/problems/remove-linked-list-elements/solutions/341875/203-yi-chu-lian-biao-yuan-su-you-ya-di-gui-c-yu-ya/ 来源&#xff1a;力…