原型设计模式
模式特点:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
程序实例:从简历原型,生成新的简历
代码特点:简历类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 '\n'.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)
作者:沐禹辰
出处:http://www.cnblogs.com/renfanzi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
出处:http://www.cnblogs.com/renfanzi/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。