Python设计模式-创建型:单例模式和工厂模式家族

  • Post author:
  • Post category:python



Python设计模式-创建型:单例模式和工厂模式家族


知识点

  • 单例模式概念及一般实现
  • 单例模式的装饰器实现
  • 简单工厂模式
  • 抽象工厂模式


单例模式(singleton)

  • 所谓单例模式,也就是说不管什么时候我们要确保只有一个对象实例存在。
  • 很多情况下,整个系统中只需要存在一个对象,所有的信息都从这个对象获取,比如系统的配置对象,或者是线程池。
  • 这些场景下,就非常适合使用单例模式。总结起来,就是说不管我们初始化一个对象多少次,真正干活的对象只会生成一次并且在首次生成。


Singleton._instance

# -*- coding: utf-8 -*-

class Singleton(object):
    """
    单例模式
    """
    class _A(object):
        """
       真正干活的类, 对外隐藏
        """
        def __init__(self):
            pass

        def display(self):
            """ 返回当前实例的 ID,是全局唯一的"""
            return id(self)

    # 类变量,用于存储 _A 的实例
    _instance = None

    def __init__(self):
        """ 先判断类变量中是否已经保存了 _A 的实例,如果没有则创建一个后返回"""
        if Singleton._instance is None:
            Singleton._instance = Singleton._A()

    def __getattr__(self, attr):
        """ 所有的属性都应该直接从 Singleton._instance 获取"""
        return getattr(self._instance, attr)


if __name__ == '__main__':
    # 创建两个实例
    s1 = Singleton()
    s2 = Singleton()
    print(id(s1), s1.display())
    print(id(s2), s2.display())
  • 使用类变量 Singleton._instance 来存储创建的实例,并且保证只会创建一次实例。
  • 由于 Python 是一门动态语言,我们可以在运行时改变类定义。
  • 在首次初始化Singleton时,我们将首次生成类_A的实例,并将其存储到 Singleton._instance 中,以后每次初始化 Singleton 时都从 Singleton._instance 获取真正干活的实例,这样我们就实现了单例模式。


装饰器

# -*- coding: utf-8 -*-

class Singleton:

    """
    单例类装饰器&



版权声明:本文为npm_run_dev__原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。