python单例和工厂模式

设计模式

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

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

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

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

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

python 复制代码
class Test:
    pass


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

打印的内存地址如下:

powershell 复制代码
<__main__.Test object at 0x0129E718>
<__main__.Test object at 0x0129E628>

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

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

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

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

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

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

python 复制代码
class Singleton:
    def call(self):
        pass


singleton = Singleton()
python 复制代码
from Singleton import singleton
s1 = singleton
s2 = singleton
print(s1)
print(s2)

输出结果

powershell 复制代码
<Singleton.Singleton object at 0x0201E388>
<Singleton.Singleton object at 0x0201E388>

两个对象的内存地址相同

使用装饰器实现单例

python 复制代码
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)

输出结果

powershell 复制代码
<__main__.Animal object at 0x01D80E98>
<__main__.Animal object at 0x01D80E98>

两个对象的内存地址相同

使用实例化方式实现单例

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

python 复制代码
class Singleton:
    def __call__(self, *args, **kwargs):
        return self


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

输出结果

powershell 复制代码
<__main__.Singleton object at 0x01CCE718>
<__main__.Singleton object at 0x01CCE718>

两个对象的内存地址相同

工厂模式

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

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

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

优点:

  • 大批量创建对象的时候有统一的入口,易于代码维护
  • 当发生修改,仅修改工厂类的创建方法即可
  • 符合现实世界的模式,即由工厂来制作产品(对象)
相关推荐
TF男孩3 小时前
ARQ:一款低成本的消息队列,实现每秒万级吞吐
后端·python·消息队列
该用户已不存在8 小时前
Mojo vs Python vs Rust: 2025年搞AI,该学哪个?
后端·python·rust
站大爷IP10 小时前
Java调用Python的5种实用方案:从简单到进阶的全场景解析
python
用户83562907805116 小时前
从手动编辑到代码生成:Python 助你高效创建 Word 文档
后端·python
侃侃_天下16 小时前
最终的信号类
开发语言·c++·算法
c8i16 小时前
python中类的基本结构、特殊属性于MRO理解
python
echoarts16 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
liwulin050616 小时前
【ESP32-CAM】HELLO WORLD
python
Aomnitrix17 小时前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
Doris_202317 小时前
Python条件判断语句 if、elif 、else
前端·后端·python