码迷,mamicode.com
首页 > 其他好文 > 详细

【设计模式】单例模式

时间:2020-06-08 10:43:38      阅读:59      评论:0      收藏:0      [点我收藏+]

标签:lang   lse   过程   多次   单例模式   区别   turn   通过   怎么办   

温故而知新,可以为师矣

开场小故事

“大鸟,今天我在公司写了一个窗体程序,当中有一个是‘工具箱’的窗体,问题就是我希望工具箱要么不出现,要么出现一个,可实际上我每单击菜单,实例化‘工具箱’,他就会出现一个,单击多次就会出现多个,你说怎么办?”

“哈哈,显然你这个‘工具箱’类也要计划生育啊,不能让他超生了。这就是一个设计模式问题呀”

ok,接下来我们就要讲讲这个设计模式---单例模式。

什么是单例模式?

单例模式,保证一个类仅有一个实例,并提供一个访它的全局访问点。单例模式是对象创建型模式。

这句话什么意思?就是说当我们对一个类进行实例化的时候,无论创建多少个对象,只会存在一个实例,至于什么是全局访问点,其实就是一个全局变量来保存一个对象。分析完成,我们通过代码来实现一下:

不过在之前,假如你已经了解了python中__new____init__用途以及区别。

class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self):
        pass

if __name__ == ‘__main__‘:
    singleton = Singleton()
    singleton2 = Singleton()
    print(id(singleton))  # 140668529220968
    print(id(singleton2))  # 140668529220968

通过代码我们可以发现,在类中维持了一个_instance的类变量,它的作用就是保持单一实例,通过__new__魔法方法改变实例的生成过程。但是程序还是存在一个小问题,每当类调用一次__new__就是默认调用一次__init__,我们期望单例模式只能有一个对象,也就需要保证初始化工作只执行一次。接下来更改一下代码:

class Singleton(object):
    _instance = None
    _init = True

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self, name):
        if self._init:
            self._init = False
            self.name = name

if __name__ == ‘__main__‘:
    singleton1 = Singleton("1")
    print(id(singleton1))
    singleton2 = Singleton("2")
    print(id(singleton2))
    print(singleton1.name) # 1
    print(singleton2.name) # 1

【设计模式】单例模式

标签:lang   lse   过程   多次   单例模式   区别   turn   通过   怎么办   

原文地址:https://www.cnblogs.com/ydongy/p/13062985.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!