博客
关于我
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/

你可能感兴趣的文章
OpenCV与AI深度学习 | 基于PyTorch实现Faster RCNN目标检测
查看>>
OpenCV与AI深度学习 | 基于PyTorch语义分割实现洪水识别(数据集 + 源码)
查看>>
OpenCV与AI深度学习 | 基于YOLO11的车体部件检测与分割
查看>>
OpenCV与AI深度学习 | 基于YOLOv8的停车对齐检测
查看>>
OpenCV与AI深度学习 | 基于机器视觉的磁瓦表面缺陷检测方案
查看>>
OpenCV与AI深度学习 | 基于深度学习的轮胎缺陷检测系统
查看>>
OpenCV与AI深度学习 | 实战 | OpenCV实现扫描文本矫正应用与实现详解(附源码)
查看>>
OpenCV与AI深度学习 | 实战 | 使用YOLOv8 Pose实现瑜伽姿势识别
查看>>
OpenCV与AI深度学习 | 实战 | 使用YoloV8实例分割识别猪的姿态(含数据集)
查看>>
OpenCV与AI深度学习 | 实战 | 基于YoloV5和Mask RCNN实现汽车表面划痕检测(步骤 + 代码)
查看>>
OpenCV与AI深度学习 | 干货 | 深度学习模型训练和部署的基本步骤
查看>>
OpenCV与AI深度学习 | 手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)
查看>>
OpenCV与AI深度学习 | 深度学习检测小目标常用方法
查看>>
Opencv中KNN背景分割器
查看>>
OpenCV中基于已知相机方向的透视变形
查看>>
OpenCV中的监督学习
查看>>
opencv中读写视频
查看>>
opencv之namedWindow,imshow出现两个窗口
查看>>
opencv之模糊处理
查看>>
Opencv介绍及opencv3.0在 vs2010上的配置
查看>>