美文网首页
07-单例模式

07-单例模式

作者: 努力爬行中的蜗牛 | 来源:发表于2018-10-30 11:02 被阅读0次
单例

类创建的对象,在系统中只有唯一的一个实例。

new方法

new方法是object这个基类提供的类方法。

  • 在内存中为对象分配存储空间
  • 返回对象的引用给解释器

注意:

  • 重写new方法一定要return super().__new__(cls)
  • 否则python解释器得不到分配了存储空间的引用对象,就不会调用对象的初始化方法
  • new方法是一个类方法,在调用时需要主动传入cls参数
class MusicPlayer(object):

    def __new__(cls, *args, **kwargs):

        # 1. 创建对象时,new方法会被自动调用
        print("创建对象,分配存储空间")

        # 2. 为对象分配空间
        instance = super().__new__(cls)

        # 3.返回对象的引用
        return instance

    def __init__(self):
        print("播放器初始化")


# 创建对象播放器对象
player = MusicPlayer()

print(player)
单例定义
  • 定义一个类属性,初始值时None,用于记录单例对象的引用
  • 重写new方法
  • 如果类属性 is None,调用父类方法分配空间,并在类属性中记录结果
  • 返回类属性中记录的对象引用
让初始化动作只执行一次
  • 定义一个类属性init_flag,标记是否执行过初始化动作,初始值为False
  • 在init方法中,判断init_flag是否为False,如果为False则执行初始化
  • 让后将init_flag设置为True
  • 这样再次执行创建对象的操作时,初始化动作就不会再执行了
class MusicPlayer(object):
    # 记录第一个被创建对象的引用
    instance = None

    # 记录是否执行过初始化方法
    init_flag = False

    def __new__(cls, *args, **kwargs):

        # 1. 判断雷属性是否为空对象
        if cls.instance is None:
            # 2. 调用父类的方法,为对象分配空间
            cls.instance = super().__new__(cls)

        # 3.返回类属性保存的对象引用
        return cls.instance

    def __init__(self):
        # 1. 判断是否执行过初始化动作
        if MusicPlayer.init_flag:
            return
        # 2. 如果没有执行过,再执行初始化动作
        print("初始化播放器")

        # 3. 修改类属性的标记
        MusicPlayer.init_flag = True


# 创建对象播放器对象
player1 = MusicPlayer()
player2 = MusicPlayer()

print(player1, player2)

相关文章

  • 07-单例模式

    单例 类创建的对象,在系统中只有唯一的一个实例。 new方法 new方法是object这个基类提供的类方法。 在内...

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • 设计模式之单例模式详解

    设计模式之单例模式详解 单例模式写法大全,也许有你不知道的写法 导航 引言 什么是单例? 单例模式作用 单例模式的...

  • Telegram开源项目之单例模式

    NotificationCenter的单例模式 NotificationCenter的单例模式分析 这种单例模式是...

  • 单例模式Java篇

    单例设计模式- 饿汉式 单例设计模式 - 懒汉式 单例设计模式 - 懒汉式 - 多线程并发 单例设计模式 - 懒汉...

  • IOS单例模式的底层原理

    单例介绍 本文源码下载地址 1.什么是单例 说到单例首先要提到单例模式,因为单例模式是单例存在的目的 单例模式是一...

  • 单例

    iOS单例模式iOS之单例模式初探iOS单例详解

  • 单例模式

    单例模式1 单例模式2

网友评论

      本文标题:07-单例模式

      本文链接:https://www.haomeiwen.com/subject/knywtqtx.html