zoukankan      html  css  js  c++  java
  • 单例模式与多例模式

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

    什么是设计模式

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

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

    单例模式

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

    多例模式

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

    ## 平时我们使用的都是多例模式
    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中模块是一个特殊的单例模式。

  • 相关阅读:
    如何雇人的十五条建议
    如何通过预加载器提升网页加载速度
    提升代码内外部质量的22条经验
    敏捷团队的组织与管理--- MPD软件工作坊培训感想(下)
    敏捷开发的道与术---MPD软件工作坊培训感想(上)
    分享自制的C#和VB Code互转工具
    基于 WPF 平台的 ActiveReports Viewer控件
    在ASP.NET MVC 中使用ActiveReports报表控件
    根据数据源字段动态设置报表中的列数量以及列宽度
    在ActiveReports页面报表中显示Google地图
  • 原文地址:https://www.cnblogs.com/Gredae/p/11528072.html
Copyright © 2011-2022 走看看