097 单例模式

Posted xichenhome

tags:

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

一、什么是单例模式

  • 整个过程中只有一个实例,所有生成的实例都指向同一块内存地址空间

二、为什么要用单例模式

  • 当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例
  • 这样可以节省内存空间

二、实现单例模式的四种方式

1.通过类的绑定方法来实现

  • 也就是通过类的静态方法来实现
name = 'xichen'
age = 18
class Mydic:
    _instance = None

    def __init__(self,name,age):
        self.name = name
        self.age = age

    @classmethod
    def get_object(cls):
        if not cls._instance:
            cls._instance = cls(name,age)
        return cls._instance


    
obj1 = Mydic.get_object()
print(obj1)
obj2 = Mydic.get_object()
print(obj2)

obj3 = Mydic(name = 'nick',age = 19)
print(obj3)

<main.Mydic object at 0x000001D3B8841978>
<main.Mydic object at 0x000001D3B8841978>
<main.Mydic object at 0x000001D3BF6ECD68>

2.通过装饰器来实现

  • 我们之前用装饰器的时候是在做atm购物车的时候和选课系统的时候做的
  • 装饰器里的func--->这里指的是cls,用这个装饰器的类
name = 'xichen'
age = 18
def wrapper(func):
    func._instance = func(name, age)
    def inner(*args,**kwargs):
        if len(args) == 0 and len(kwargs) == 0:
            return func._instance
        return func(*args, **kwargs)

    return inner


@wrapper
class Mydic:
    def __init__(self,name,age):
        self.name = name
        self.age = age


obj1 = Mydic()
print(obj1)
obj2 = Mydic()
print(obj2)

obj3 = Mydic(name = 'nick',age = 19)
print(obj3)

<main.Mydic object at 0x0000015AEA2C92B0>
<main.Mydic object at 0x0000015AEA2C92B0>
<main.Mydic object at 0x0000015AEA0F9E80>

3.通过元类来实现

name = 'xichen'
age = 18
class Mymeta(type):
    def __init__(self,name,bases,dic):
        self._instance=self(name, age)

    def __call__(self, *args, **kwargs):

        if len(args)==0 and len(kwargs)==0:
            return self._instance
        else:
            obj=object.__new__(self)
            obj.__init__(*args, **kwargs)
            return obj

class Mydic(metaclass=Mymeta):
    def __init__(self,port,host):
        self.port=port
        self.host=host


obj1=Mydic()
print(obj1)

obj2=Mydic()
print(obj2)

obj3=Mydic('nick',19)
print(obj3)

<main.Mydic object at 0x000001D58E28CDA0>
<main.Mydic object at 0x000001D58E28CDA0>
<main.Mydic object at 0x000001D58E28CC88>

4.通过模块类实现

# Mydic.py
import settings
class Modlers():
    def __init__(self,name,age):
        self.name = name
        self.age = age

s1= Modlers(settings.name,settings.age)
# settings.py
name = 'xichen'
age = 18
def test():
    from mydic import s1
    print(s1)

def test2():
    from mydic import s1 as s2
    print(s2)

test()
test2()
    
from mydic import s1
from mydic import Modlers
s2 = Modlers('nick',19)
print(s2)

<mydic.Modlers object at 0x0000019967C8CF28>
<mydic.Modlers object at 0x0000019967C8CF28>

<mydic.Modlers object at 0x000002AAFC639128>

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

深入理解设计模式-单例模式(饿汉单例模式懒汉单例模式双锁单例模式)

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

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

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

单例模式

单例模式