单例设计模式掌握

Posted allwell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例设计模式掌握相关的知识,希望对你有一定的参考价值。

概念

什么是设计模式?

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

?   设计模式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

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

 

以上是关于单例设计模式掌握的主要内容,如果未能解决你的问题,请参考以下文章

JAVA中的单例设计模式-分为懒汉式和饿汉式(附代码演示)

JAVA中的单例设计模式-分为懒汉式和饿汉式(附代码演示)

单例设计模式掌握

Java 设计模式之单例学习与掌握

单例模式虽然简单,但是你真的完全掌握了吗

设计模式之单例模式