python单例和工厂模式

news2024/9/28 4:24:05

设计模式

设计模式是一种编程套路,可以极大的方便程序的开发

最常见、最经典的设计模式,就是学习的面向对象

除了面向对象之外,在编程中也有很多既定的套路可以方便开发,我们称之为设计模式:

  • 单例、工厂模式
  • 建造者、责任链、状态、备忘录、解释器、访问者、观察者、中介、模板、代理模式
  • 等等模式
单例模式

创建类的实例后,可以得到一个完整的、独立的类对象

class Test:
    pass


t1 = Test()
t2 = Test()
print(t1)
print(t2)

打印的内存地址如下:

<__main__.Test object at 0x0129E718>
<__main__.Test object at 0x0129E628>

发现两个内存地址是不同的,即t1和t2是两个独立的对象

某些场景下,我们需要一个类无论获取多少次类对象,都仅仅提供一个具体的实例

用以节省创建类对象的开销和内存开销

比如某些工具类,仅需一个实例,即可在各处使用

这就是单例模式所要实现的效果

使用模块方式实现单例模式

class Singleton:
    def call(self):
        pass


singleton = Singleton()
from Singleton import singleton
s1 = singleton
s2 = singleton
print(s1)
print(s2)

输出结果

<Singleton.Singleton object at 0x0201E388>
<Singleton.Singleton object at 0x0201E388>

两个对象的内存地址相同

使用装饰器实现单例

def singleton(cls):
    instance = {}

    def _singleton(*args, **kwargs):
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]

    return _singleton


@singleton
class Animal(object):
    pass


if __name__ == '__main__':
    a1 = Animal()
    a2 = Animal()
    print(a1)
    print(a2)

输出结果

<__main__.Animal object at 0x01D80E98>
<__main__.Animal object at 0x01D80E98>

两个对象的内存地址相同

使用实例化方式实现单例

在‌Python中,call()是一个特殊方法,用于将一个类的实例变成一个可调用对象。

class Singleton:
    def __call__(self, *args, **kwargs):
        return self


if __name__ == '__main__':
    sin = Singleton()
    s1 = sin()
    s2 = sin()
    print(s1)
    print(s2)

输出结果

<__main__.Singleton object at 0x01CCE718>
<__main__.Singleton object at 0x01CCE718>

两个对象的内存地址相同

工厂模式

当需要大量创建一个类的实例的时候,可以使用工厂模式

从原生的使用类的构造去创建对象的形式迁移到基于工厂提供的方法去创建对象的形式

image-20240927110251064

使用工厂类的get_person()方法去创建具体的类对象

优点:

  • 大批量创建对象的时候有统一的入口,易于代码维护
  • 当发生修改,仅修改工厂类的创建方法即可
  • 符合现实世界的模式,即由工厂来制作产品(对象)

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

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

相关文章

2022年上真题(案例分析)

一、数据流图 1. E1&#xff1a;商户 E2&#xff1a;外卖平台 E3&#xff1a;用户 E4&#xff1a;支付系统 2. D1&#xff1a;商户用户信息表 D2&#xff1a;订单表 D3&#xff1a;餐品信息表 D4&#xff1a;评价表 3. 数据流名称 …

Linux设备驱动中的异步通知与异步I/O学习s

1、异步通知的概念和作用 异步通知的意思是&#xff1a;一旦设备就绪&#xff0c;则主动通知应用程序&#xff0c;这样应用程序根本就不需要查询设备状态&#xff0c;这一点非常类似于硬件上”中断“的概念&#xff0c;比较准确的称谓是”信号驱动的异步I/O“。信号是在软件层次…

盘点2024年4款高效率的语音转文字工具。

语音转换文字软件真的是一种提高效率的神器&#xff0c;我在工作中常常因为手动记录太慢而选择录音。事后在形成记录&#xff0c;但效率比较低。自从知道有直接转换的工具之后&#xff0c;我有再多的录音都不怕了。如果大家也有跟我一样的工作时&#xff0c;可以试试使用这些语…

C++之STL—常用拷贝和替换算法

copy(iterator beg, iterator end, iterator dest); // 按值查找元素&#xff0c;找到返回指定位置迭代器&#xff0c;找不到返回结束迭代器位置 // beg 开始迭代器 // end 结束迭代器 // dest 目标起始迭代器 replace(iterator beg, iterator end, oldvalue, newvalue); …

儿童手抄报模板-200个(家有神兽必备)

在这个充满色彩与想象的世界里&#xff0c;每一位小朋友都是一位小小艺术家和梦想家。作为家长或老师&#xff0c;我们总是希望能为他们的学习生活增添一抹亮色&#xff0c;激发他们的创造力与探索欲。今天&#xff0c;就为大家带来一份超级实用的资源——儿童手抄报模板-200个…

Spring:强制登陆与拦截器

1.只使用session验证 &#xff08;1&#xff09;第一步&#xff1a;用户登陆时存储session ApiOperation("用户登陆") PostMapping("/login") public AppResult login(HttpServletRequest request,RequestParam("username") ApiParam("用…

将上一篇的feign接口抽取到公共api模块(包含feign接口示例)

文章目录 一、准备二、主要工作三、建立dto类四、添加多个feign接口五、测试六、目录结构6.1 父工程service-demo6.2 order-service模块6.3 product-service模块6.4 sd-api模块 一、准备 将上一篇的目录结构改造一下&#xff1a; 修改包名使根路径分别为com.hdl.order和com.h…

微信支付:chooseWXPay:fail, the permission value is offline verifying

在开发公众号微信支付的时候&#xff0c;在微信开发者工具中使用 WeixinJSBridge 唤起 微信支付&#xff0c;页面上看到微信支付的loading一闪而过&#xff0c;但是没有出现微信支付的页面。控制台log显示错误信息&#xff1a;“chooseWXPay:fail, the permission value is off…

实验1 Python语言基础一

目录 实验1 Python语言基础一1、下载安装Python&#xff0c;贴出验证安装成功截图2、建立test.py文件,运行后贴出截图&#xff0c;思考if __name”__main__”的意思和作用3、分别运行下面两种代码&#xff0c;分析运行结果产生的原因。记牢python中重要语法“tab”的作用。6、编…

企业内训|大模型/智算行业发展机会深度剖析-某数据中心厂商

北京中嘉和信通信技术有限公司于8月29日举办了一场主题为“大模型/智算行业发展机会深度剖析”的企业内训。此次培训由TsingtaoAI公司负责人汶生主讲&#xff0c;针对当前大模型技术的发展现状、应用场景及未来趋势进行了全面分析和解读。 汶生老师在培训中深入剖析了大模型的…

京东商品详情API(item_get)性能优化策略:提升数据抓取效率

在电商领域&#xff0c;快速、准确地获取商品信息对于提升用户体验、优化库存管理和市场决策至关重要。京东商品详情API&#xff08;item_get&#xff09;作为京东开放平台提供的一项重要服务&#xff0c;允许开发者获取京东平台上商品的详细信息。然而&#xff0c;如何高效利用…

xxl-job 适配达梦数据库

前言 在数字化转型的浪潮中&#xff0c;任务调度成为了后端服务不可或缺的一部分。XXL-JOB 是一个轻量级、分布式的任务调度框架&#xff0c;广泛应用于各种业务场景。达梦数据库&#xff08;DM&#xff09;&#xff0c;作为一款国内领先的数据库产品&#xff0c;已经被越来越…

详解调用钉钉AI助理消息API发送钉钉消息卡片给指定单聊用户

文章目录 前言准备工作1、在钉钉开发者后台创建一个钉钉企业内部应用&#xff1b;2、创建并保存好应用的appKey和appSecret&#xff0c;后面用于获取调用API的请求token&#xff1b;3、了解AI助理主动发送消息API&#xff1a;4、应用中配置好所需权限&#xff1a;4.1、权限点4.…

光控资本:国庆节股市能不能继续交易?A股放量大涨

早年这个时分&#xff0c;商场谈论的最多论题是&#xff0c;持股过节仍是持币过节。 而本年却大不一样&#xff0c;“国庆节股市能不能继续生意”成为这两天股民之间的梗。 今天上午&#xff0c;A股继续暴升&#xff0c;创了三个纪录。一是上午成交额为9466亿元&#xff0c;跨…

2024 maya的散布工具sppaint3d使用指南

目前工具其实可以分为三个版本 1 最老的原版 时间还是2011年的&#xff0c;只支持python2版的maya 2 作者python3更新版 后来作者看maya直到2022上还是没有类似好用方便的工具&#xff0c;于是更新到了2022版本 这个是原作者更新的2022版本&#xff0c;改成了python3&#…

一款开源的通用PDF处理神器,功能强悍!

文章目录 前言一、简介二、功能三、安装1.二进制安装2.编译安装 四、开源地址 前言 PDF是一种功能强大且广泛应用的电子文档格式&#xff0c;适用于各种文档管理和共享需求。由于PDF文档注重阅读而非编辑&#xff0c;很多文档处理会让我们非常头疼。 网上有非常多的PDF相关的…

re轻松拆分四则运算expression(^从头匹配、(?:xxxx)非捕获组、| 交替运算符联合演习)

与ai对抵聊“算式匹配”&#xff0c;发现^从头匹配、(?:xxxx)非捕获组、| “交替”运算符联合使用的妙处。 (笔记模板由python脚本于2024年09月27日 18:35:32创建&#xff0c;本篇笔记适合喜欢python喜欢正则的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;…

《GC8545:智能马桶电路板的卓越替代之选》

在智能马桶领域&#xff0c;电路板的性能至关重要。随着技术的不断发展&#xff0c;寻找更优质、更高效的芯片来替代传统型号已成为行业的趋势。而 GC8545 芯片以其卓越的性能和广泛的适用性&#xff0c;正逐渐成为替代其他型号的理想选择。其中最常用的就是替代的型号LV8548和…

【machine learning-13-线性回归的向量化】

向量化 向量化简洁并行计算 向量化 线性回归的向量化表示如下&#xff0c;其中w 和 x 都分别加了箭头表示这是个向量&#xff0c;后续不加也可以表示为向量&#xff0c;w和x点乘加上b&#xff0c;就构成了多元线性回归的表达方式&#xff0c;如下&#xff1a; 那么究竟为什么…

产品管理-互联网产品(2):需求管理

一、概述 需求问题解决方案&#xff0c;产品经理是解决问题专家。提出求产品经理需要考虑如下四点&#xff1a; 1、客户的目的是什么&#xff1f;2、这条需求是否隐含了解决方案&#xff1f;3、客户的潜在目标是什么&#xff1f;4、如何确定需求已得到满足&#xff1f; 二、…