单例模式与多例模式

设计模式之单例模式与多例模式

什么是设计模式

设计模式是开发人员在开发过程中面临的一般问题的解决方案

这些解决方案是众多开发人员经过相当长的一段时间的试验和错误 总结 出来的

单例模式

一个类只有单个对象被创建

多例模式

一个类可以有多个对象被创建

## 平时我们使用的都是多例模式
class custom():
    pass

c1 = custom()
c2 = custom()
print(c1)   # <__main__.custom object at 0x0000020305FEA248>
print(c2)   # <__main__.custom object at 0x0000020305FEA188>
print(c1 is c2)   # False
## 我们可以通过他们的内存地址来判断是否是同一个实例也可以使用is判断

创建单例实例

  1. 通过类的绑定方法

    class custom():
    
        # 记录实例对象
        _is_create = None
        def __init__(self, name):
            self.name = name
    
        # 通过类方法创建实例
        @classmethod
        def create_class(cls, name):
            # 如果没有对象
            if not cls._is_create:
                # 创建对象并将对象赋值给_is_create
                cls._is_create = cls(name)
            return cls._is_create
    
    # 通过类方法来创建类的实例化对象
    c1 = custom.create_class('张三')
    c2 = custom.create_class('李四')
    
    print(c1 is c2)   # False
  2. 通过装饰器

    def wer(func):
        # 记录多个类的实例化对象
        _instance = {}
    
        def inner(*args, **kwargs):
            # 如果没有对象
            if func not in _instance:
                # 创建对象并将对象赋值给_instance
                _instance[func] = func(*args, **kwargs)
            return _instance[func]
        return inner
    
    @wer
    class Myclass(object):
        pass
    
    m1 = Myclass()
    m2 = Myclass()
    
    print(m1 is m2)   # True
  3. 通过元类

    class Mytype(type):
    
        # 当实例化类的时候会调用元类的__call__方法
        def __call__(self, *args, **kwargs):
            # 如果实例化的类中没有_instance属性就创建一个实例化对象
            if not getattr(self, '_instance'):
                # 创建”空“对象赋值给_instance
                self._instance = self.__new__(self)
                # 为“空”对象初始化
                self._instance.__init__(*args, **kwargs)
    
            return self._instance
    
    class Foo(metaclass=Mytype):
        _instance = None
    
    f1 = Foo()
    f2 = Foo()
    print(f1 is f2)
  4. 在python中导入代码中的模块也是一个对象,只是这个对象是只导入一次,不论你是导入几次。

    在Python中模块是一个特殊的单例模式。

猜你喜欢

转载自www.cnblogs.com/Gredae/p/11528072.html