博客
关于我
Python(25)-单例设计模式
阅读量:208 次
发布时间:2019-02-28

本文共 1509 字,大约阅读时间需要 5 分钟。

单例设计模式

设计模式是一种面向解决问题的方法论,它通过复用已有的解决方案来解决不同的问题。学习设计模式可以帮助开发者在遇到常见问题时快速找到解决方案。

单例设计模式的应用场景

单例设计模式的核心思想是保证一个类在系统中只存在唯一的一个实例。这类似于现实生活中的“只有一台打印机”或“只有一只扫地机器人”的场景。在软件开发中,这种设计模式常用于资源受限的环境下的对象管理,比如音乐播放器、文件回收站等。

使用__new__方法实现单例

在Python中,类的实例创建过程由__new__方法负责。这个方法是object类中的静态方法,用于分配内存空间并创建对象。为了实现单例设计模式,我们可以通过重写__new__方法来控制对象的创建。

以下是一个简单的实现例子:

class MusicPlayer(object):    # 用于记录对象实例的类属性    instance = None    def __new__(cls, *args, **kwargs):        # 检查是否已经存在实例        if cls.instance is None:            # 创建第一个实例            cls.instance = super().__new__(cls)        # 返回已有的实例        return cls.instance    # 其他方法和属性可以在这里定义

确保初始化动作只执行一次

在上述实现中,每次通过MusicPlayer()创建实例都会返回同一个实例。然而,初始化方法(__init__)会在每次创建实例时被调用,这可能带来不必要的性能开销。

为了优化,我们可以通过一个标记来确保初始化方法只执行一次:

class MusicPlayer(object):    # 用于记录对象实例的类属性    instance = None    initialized = False    def __new__(cls, *args, **kwargs):        if cls.instance is None:            cls.instance = super().__new__(cls)        return cls.instance    def __init__(self):        global initialized        if not initialized:            print("初始化方法执行啦")            initialized = True

测试代码

通过以下代码可以测试上述实现:

player1 = MusicPlayer()player2 = MusicPlayer()print(player1)print(player2)

输出结果

运行上述代码会输出:

初始化方法执行啦<__main__.MusicPlayer object at 0x7f4ea08da438><__main__.MusicPlayer object at 0x7f4ea08da438>

这表明,尽管创建了两个MusicPlayer实例,但它们指向同一个对象,并且初始化方法只执行了一次。

总结

单例设计模式通过确保一个类在系统中只存在唯一实例,避免了不必要的资源消耗。在Python中,可以通过重写__new__方法来实现这一点。同时,通过在初始化方法中使用标记,可以进一步优化代码,确保初始化动作只执行一次。这种设计模式在资源受限的场景下尤为实用。

转载地址:http://uxps.baihongyu.com/

你可能感兴趣的文章
OSG学习:几何对象的绘制(二)——简易房屋
查看>>
OSG学习:几何对象的绘制(四)——几何体的更新回调:旋转的线
查看>>
OSG学习:场景图形管理(一)——视图与相机
查看>>
OSG学习:场景图形管理(三)——多视图相机渲染
查看>>
OSG学习:场景图形管理(二)——单窗口多相机渲染
查看>>
OSG学习:场景图形管理(四)——多视图多窗口渲染
查看>>
OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
查看>>
Sql 随机更新一条数据返回更新数据的ID编号
查看>>
OSG学习:空间变换节点和开关节点示例
查看>>
OSG学习:纹理映射(一)——多重纹理映射
查看>>
OSG学习:纹理映射(七)——聚光灯
查看>>
OSG学习:纹理映射(三)——立方图纹理映射
查看>>
OSG学习:纹理映射(二)——一维/二维/简单立方图纹理映射
查看>>
OSG学习:纹理映射(五)——计算纹理坐标
查看>>
OSG学习:纹理映射(六)——灯光
查看>>
OSG学习:纹理映射(四)——三维纹理映射
查看>>
OSG:从源码看Viewer::run() 一
查看>>
osi 负载均衡
查看>>
OSI七层模型与TCP/IP五层模型(转)
查看>>
OSI七层模型与TCP/IP四层与五层模型详解
查看>>