单例模式

Posted xiongchao0823

tags:

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

单例模式

什么是单例模式

- 单例模式:基于某种方法实例化多次得到的实例就是同一个

为什么用单例模式

- 当实例化多次得到的对象中存放的属性都是一样的情况,应该将多个对象指向同一个内存,
即同一个实例

1.单例模式(类内部定义静态方法)

name = 'xc'
pwd = 123

class mysql:

    state = None  # 最先开辟的内存空间,用来实现单例模式,也就是相同的对象使用同一个内存空间
    def __init__(self,name,pwd):  
        self.name = name
        self.pwd = pwd
    @classmethod  # 指定类方法
    def get_memory(cls):  # 定义类方法
        if not cls.state: # 如果类中的state没有值
            cls.state = cls(name,pwd) # 附上我们定义的默认值
        return cls.state    # 最后输出cls.state
a1 = Mysql.get_memory()
a2 = Mysql.get_memory()
a3 = Mysql.get_memory()
print(a1)
print(a2)
print(a3)
打印 -->
    <__main__.Mysql object at 0x000001FA3E7924A8> 
    <__main__.Mysql object at 0x000001FA3E7924A8> 
    <__main__.Mysql object at 0x000001FA3E7924A8>
a4 = Mysql('xc',123)
打印 -->
    <__main__.Mysql object at 0x0000021394F1B470>

2.单例模式(装饰器)

# setting.py
Name = 'xc'
Age = 18

def auth(cls):
    import setting
    cls.state = cls(setting.Name,setting.Age): # 定义一个默认值,也就是一个名称空间
    def inner(*args,**kwargs)
        if len(args) == 0 and len(kwargs) == 0:
            return cls.state
        return cls(*args,**kwargs)
        
     
    return inner
@auth 
class Foo:
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
p1 = Foo()
p2 = Foo()
p3 = Foo()

print(p1)
print(p2)
print(p3)    

3.单例模式(元类)

# setting.py
Name = 'xc'
Age = 18



import setting
class Mymeta(type):
    def __init__(self,class_name,class_bases,class_dic):
        self.state = self(setting.Name,setting.Age) # 使用类的__init__,重写一个self.state到类的名称空间中,也就是Foo的名称空间
        
    def __call__(self,*args,**kwargs):
        if len(args) == 0 and len(kwargs) == 0:
            return self.state
        obj = self.__new__(self)
        obj.__new__(*args,**kwargs)
        return obj  

class Foo(metaclass = Mymeta):
    def __init__(self,name,age):
        self.name = name
        self.age = age

4.单例模式(模块)

- 模块是一个天然的单例
# setting.py
class Foo:
    def __init__(self,name,age):
        self.name = name
        self.age = age
s = Foo('xc',18)


import setting.py
s1 = setting.s
s2 = setting.s
s3 = setting.s1

pring(s1)
print(s2)
print(s3)

5.单例模式(不同值,同一个内存空间)

class Foo:
    state = None
    def __init__(self,name,age):
        self.name = name
        self.age = age
    
    def __new__(cls,*args,**kwargs):
        if not cls.state:
            cls.state = object.__new__(cls)
        return cls.state


f1 = Foo('xc',123)
f2 = Foo('www',123)

print(f1)
print(f2)

打印 -->
    -<__main__.Foo object at 0x000001EF71392400>
    -<__main__.Foo object at 0x000001EF71392400>

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

单例模式(单例设计模式)详解

Java模式设计之单例模式(二)

单例模式(饿汉式单例模式与懒汉式单例模式)

单例模式

单例模式

设计模式之单例模式