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

单例设计模式【掌握】

时间:2018-11-22 22:31:15      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:代理委托   运行   委托   ict   构造函数   test   程序   on()   *args   

概念

什么是设计模式?

?   设计模式是别人已经总结好的可以解决问题的方案

?   设计模式23种,常用的是单例设计模式,工厂设计模式,生产者消费者设计模式,代理委托设计模式等

 

什么是单例设计模式?

?   单例:单个的实例,单个的对象

?   程序在运行的过程中,确保某一个类只能有一个实例【对象】,不管在程序的哪个位置获取,获取到的都是同一个对象

  单例设计模式的核心;一个类有且只能有一个对象,并且该对象可以应用于整个程序中

使用

1.使用new

类似于构造函数,优先于构造函数

代码演示:

#__new__:在__init__之前创建对象

class Sigleton(object):
    #定义一个类属性【可以通过类名】
    #作用:用于返回当前类的实例
    instance = None

    #重写new函数
    def __new__(cls, *args, **kwargs):
        #将当前类的对象和instance变量联系起来
        #思路;如果cls.instance为None,则创建对象并赋值,如果不为None,则直接返回对象
        if not  cls.instance:
            cls.instance = super(Sigleton,cls).__new__(cls,*args, **kwargs)
        return cls.instance


s1 = Sigleton()
s2 = Sigleton()
s3 = Sigleton()
print(id(s1) == id(s2))  #True
print(id(s1) == id(s3))

print(s1 is s2)

2.使用装饰器

代码演示:

#装饰器:作用于一个函数,也可以作用域一个类
def sigleton(cls):
    instance = {}
    #getInstance/defaultxxx/ currentxxx
    def getInstance(*args, **kwargs):
        #思路1:可以类似于new,通过是否为NOne
        #思路2:将cls作为key,cls对应的实例作为value存储到字典中
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)   #dict[key] = value
        return  instance[cls]

    return  getInstance

@sigleton
class Test(object):
    pass

t1 = Test()
t2 = Test()
print(id(t1) == id(t2))
print(t1 is t2)

3.自定义类【不建议使用】

代码演示:

class Check(object):
    instance = None

    @classmethod
    def getInstance(cls,*args, **kwargs):
        if not cls.instance:
            cls.instance = cls(*args, **kwargs)

        return cls.instance

c1 = Check.getInstance()
c2 = Check.getInstance()

c3 = Check()

print(id(c1) == id(c2))
print(c1 is c2)
print(c1 is c3)  #False

#弊端:还是可以通过类名创建对象,但凡在类外面创建的对象,都属于不同的对象

 

单例设计模式【掌握】

标签:代理委托   运行   委托   ict   构造函数   test   程序   on()   *args   

原文地址:https://www.cnblogs.com/allwell/p/10004135.html

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