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

优点:

  • 大批量创建对象的时候有统一的入口,易于代码维护
  • 当发生修改,仅修改工厂类的创建方法即可
  • 符合现实世界的模式,即由工厂来制作产品(对象)
相关推荐
achaoyang1 分钟前
【Python中while循环】
开发语言·python
呆呆小雅3 分钟前
C# 封装
java·开发语言·c#
蒜蓉大猩猩10 分钟前
Vue.js - 组件化编程
开发语言·前端·javascript·vue.js·前端框架·ecmascript
南鸳61023 分钟前
Scala:根据身份证号码,输出这个人的籍贯
开发语言·后端·scala
eclipsercp35 分钟前
PyQt5:Python GUI开发的超级英雄
开发语言·python·qt
军训猫猫头42 分钟前
44.扫雷第二部分、放置随机的雷,扫雷,炸死或成功 C语言
c语言·开发语言
北巷!!43 分钟前
宇信科技JAVA笔试(2024-11-26日 全部AK)
java·开发语言·科技
ᝰꫝꪉꪯꫀ36144 分钟前
JavaWeb——SpringBoot原理
java·开发语言·后端·springboot
Octopus20771 小时前
【C++】读取数量不定的输入数据
开发语言·c++·笔记·学习
忘梓.1 小时前
C嘎嘎探索篇:栈与队列的交响:C++中的结构艺术
c语言·开发语言·c++·