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 版权协议,转载请附上原文出处链接和本声明。