模式特点:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
程序实例:从简历原型,生成新的简历
代码特点:简历类Resume提供的Clone()方法其实并不是真正的Clone,只是为已存在对象增加了一次引用。
Python为对象提供的copy模块中的copy方法和deepcopy方法已经实现了原型模式,但由于例子的层次较浅,二者看不出区别。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 这里肯定要做深拷贝,要不然python的就是对象的引用
from copy import deepcopy
class Client:
def __init__(self):
self.x = 1
self.y = 3
self.z = 'hello'
self._foo = 'private'
def __str__(self):
return '
'.join(['{}: {}'.format(key, value) for key, value in self.__dict__.items() if not key.startswith('_')])
class Prototype:
def __init__(self):
self._objs = {}
def registerObject(self, name, obj):
"""注册对象"""
self._objs[name] = obj
def unregisterObject(self, name):
"""取消注册"""
del self._objs[name]
def clone(self, name, **attr):
"""克隆对象"""
try:
obj = deepcopy(self._objs[name])
# 但是会根据attr增加或覆盖原对象的属性
obj.__dict__.update(attr)
return obj
except Exception as e:
pass
if __name__ == '__main__':
client = Client()
prototype = Prototype()
prototype.registerObject("client", client)
client_b = prototype.clone("client", foo="zhangsan", price=80)
print(id(client), client)
print(id(client_b), client_b)