原型设计模式

模式特点:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

程序实例:从简历原型,生成新的简历

代码特点:简历类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)

 

 

posted @ 2016-11-04 20:02  我当道士那儿些年  阅读(185)  评论(0编辑  收藏  举报