原型模式: 用于创建重复的对象,同时保证性能 这种模式首先是实现了一个「原型接口」, 该接口用于创建当前对象的克隆, 例如一个对象需要在一个高代价的数据库操作之后被创建,我们可以缓存该对象,在下一个请求时返回它的克隆,需要时再更新数据库,以此来减少数据库调用 使用场景: 1、资源优化场景 2、类初始化需要消耗非常多资源 3、一个对象多个修改者的场景
import copyfrom collections import OrderedDictclass Book(object):def __init__(self, name, authors, price, **kwargs):self.name = nameself.authors = authorsself.price = price# 添加额外属性self.__dict__.update(kwargs)print("完成实例化了")def __str__(self):mylist = []ordered = OrderedDict(sorted(self.__dict__.items()))for key in ordered.keys():mylist.append('{}: {}'.format(key, ordered[key]))if key == "price":mylist.append("$")mylist.append('\n')return ''.join(mylist)class ProtoType(object):"""原型接口"""def __init__(self):"""初始化一个原型列表"""self.objs = dict()def register(self, identifier, obj):"""在原型列表中注册原型对象"""self.objs[identifier] = objdef unregister(self, identifier):"""从原型列表中删除原型对象"""del self.objs[identifier]def clone(self, identifier, **kwargs):"""根据identifier 在原型列表中查找原型对象并克隆"""found = self.objs.get(identifier)if not found:raise ValueError('Incorrect object identifier: %s' % identifier)obj = copy.deepcopy(found)# 用新的属性值替换原型对象中的对应属性obj.__dict__.update(kwargs)return objif __name__ == '__main__':b1 = Book('python', ('zaygee', 'hoan'), price=10, puhlisher="popping J")print(b1)prototype = ProtoType()ids = "1111"prototype.register(ids, b1)b2 = prototype.clone(ids, name="java", price=11, puhlisher="zaygee")print(b2)print("id(b1) == id(b2): ", id(b1) == id(b2))"""完成实例化了authors: ('zaygee', 'hoan')name: pythonprice: 10$puhlisher: popping Jauthors: ('zaygee', 'hoan')name: javaprice: 11$puhlisher: zaygeeid(b1) == id(b2): False"""
