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()方法去创建具体的类对象

优点:

  • 大批量创建对象的时候有统一的入口,易于代码维护
  • 当发生修改,仅修改工厂类的创建方法即可
  • 符合现实世界的模式,即由工厂来制作产品(对象)
相关推荐
吃好睡好便好1 小时前
提取矩阵某一行或某一列元素
开发语言·人工智能·线性代数·算法·matlab·矩阵
小江的记录本4 小时前
【JVM虚拟机】垃圾回收GC:四种引用类型:强引用、软引用、弱引用、虚引用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
APIshop4 小时前
Python 获取 1688 商品采集 API 接口 | 工厂货源自动化对接商品信息 | 无需选品
运维·python·自动化
deepin_sir4 小时前
10 - 函数
开发语言·python
z落落5 小时前
C#String字符串
开发语言·c#·php
猫头虎-前端技术5 小时前
JS 作用域与闭包:从变量提升到闭包陷阱的超详细解析
开发语言·javascript·云计算·bootstrap·ecmascript·openstack·perl
charlee445 小时前
《GIS基础原理与技术实践》配套案例(Python版)
python·conda·numpy·gis·环境配置
枫叶林FYL5 小时前
项目十:事件溯源仓储管理系统(WMS)仿真实现
开发语言·python
繁华落尽,倾城殇?5 小时前
[C++11] : atomic,nullptr,default/delete,enum class
开发语言·c++·c++11·nullptr·atomic·enum class·default/delete
01_ice6 小时前
C语言数据在内存中的存储
c语言·开发语言