只生产一个实例,复用实例。节省空间。避免多重占用。
使用 new 在实例化之前调用。
多线程,同时执行完 if not hasattr() 会产生新实例。要求 检查和创建实例同时执行。所以需要加锁。
但是加锁会耗时,互相等待。如果实例已经存在,就不需要加锁了。
import threading
class Singleton(object):
_instance_lock = threading.Lock()
def __init__(self):
pass
def __new__(cls, *args, **kwargs):
if not hasattr(Singleton, "_instance"):
with Singleton._instance_lock:
if not hasattr(Singleton, "_instance"):
Singleton._instance = object.__new__(cls)
return Singleton._instance

每一种产品交给一个工厂生产。通过传递参数,建立实例。把创建工作交给工厂本身,隐藏内部类。
隐藏构造过程的复杂度。

代理模式定义如下:为某对象提供一个代理,以控制对此对象的访问和控制。
代理模式在使用过程中,应尽量对抽象主题类进行代理,而尽量不要对加过修饰和方法的子类代理。
动态代理
代理类在程序运行时创建的代理方式被成为动态代理。
装饰器模式定义如下:动态地给一个对象添加一些额外的职责。
在增加功能方面,装饰器模式比生成子类更为灵活。