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

你可能感兴趣的文章
Openmax IL (二)Android多媒体编解码Component
查看>>
OpenMCU(一):STM32F407 FreeRTOS移植
查看>>
OpenMCU(三):STM32F103 FreeRTOS移植
查看>>
OpenMCU(三):STM32F103 FreeRTOS移植
查看>>
OpenMCU(二):GD32E23xx FreeRTOS移植
查看>>
OpenMCU(五):STM32F103时钟树初始化分析
查看>>
OpenMCU(四):STM32F103启动汇编代码分析
查看>>
OpenMetadata 命令执行漏洞复现(CVE-2024-28255)
查看>>
OpenMMLab | AI玩家已上线!和InternLM解锁“谁是卧底”新玩法
查看>>
OpenMMLab | S4模型详解:应对长序列建模的有效方法
查看>>
OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
查看>>
OpenMMLab | 不是吧?这么好用的开源标注工具,竟然还有人不知道…
查看>>
OpenMMLab | 如何解决大模型长距离依赖问题?HiPPO 技术深度解析
查看>>
OpenMMLab | 面向多样应用需求,书生·浦语2.5开源超轻量、高性能多种参数版本
查看>>
OpenMP 线程互斥锁
查看>>
OpenMV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
查看>>
OpenObserve云原生可观测平台本地Docker部署与远程访问实战教程
查看>>
openoffice使用总结001---版本匹配问题unknown document format for file: E:\apache-tomcat-8.5.23\webapps\ZcnsDms\
查看>>
views
查看>>
OpenPPL PPQ量化(2):离线静态量化 源码剖析
查看>>