原型模式(Prototype design pattern)的动机是为了让用户可以通过复制对象获得一个对象的副本。此模式的出现是因为在C++和Java里需要用此模式来更方便的拷贝对象,但在Python中要实现对一个对象的拷贝有更简单办法,我们就在这里简单的举个例子:
#coding=utf-8 class Foo(object): def __init__(self, x, y): self.x = x self.y = y def __str__(self): return "id: {}, x: {}, y: {}".format(id(self), self.x, self.y) if __name__ == '__main__': foo = Foo(1, 2) # 利用deepcopy获得新对象 import copy foo1 = copy.deepcopy(foo) foo1.x = 3 foo1.y = 4 print(foo, foo1) # 利用__class__方法获得新 foo2 = foo1.__class__(5, 6) print(foo, foo2) # Output >id: 4312696592, x: 1, y: 2 id: 4312696928, x: 3, y: 4 >id: 4312696592, x: 1, y: 2 id: 4312697096, x: 5, y: 6上面我们用两种原型方式实现了对Foo对象的拷贝,第一种是利用Python语言内置的deepcopy,第二种则用了更优雅的__class__方法。
需要注意一点的是,进行clone操作后,新对象的构造函数没有被二次执行,新对象的内容是从内存里直接拷贝的。
优点: 1、性能极佳,直接拷贝比在内存里直接新建实例节省不少的资源; 2、简化对象创建,同时避免了构造函数的约束,不受构造函数的限制直接复制对象,是优点,也有隐患,这一点还是需要多留意一些。 使用场景: 1、对象在修改过后,需要复制多份的场景。如本例和其它一些涉及到复制、粘贴的场景; 2、需要优化资源的情况。如,需要在内存中创建非常多的实例,可以通过原型模式来减少资源消耗。此时,原型模式与工厂模式配合起来,不管在逻辑上还是结构上,都会达到不错的效果; 3、某些重复性的复杂工作不需要多次进行。如对于一个设备的访问权限,多个对象不用各申请一遍权限,由一个设备申请后,通过原型模式将权限交给可信赖的对象,既可以提升效率,又可以节约资源。
1、深拷贝和浅拷贝的使用需要事先考虑周到; 2、某些编程语言中,拷贝会影响到静态变量和静态函数的使用。
