原型模式: 用于创建重复的对象,同时保证性能 这种模式首先是实现了一个「原型接口」, 该接口用于创建当前对象的克隆, 例如一个对象需要在一个高代价的数据库操作之后被创建,我们可以缓存该对象,在下一个请求时返回它的克隆,需要时再更新数据库,以此来减少数据库调用 使用场景: 1、资源优化场景 2、类初始化需要消耗非常多资源 3、一个对象多个修改者的场景
import copy
from collections import OrderedDict
class Book(object):
def __init__(self, name, authors, price, **kwargs):
self.name = name
self.authors = authors
self.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] = obj
def 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 obj
if __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: python
price: 10$
puhlisher: popping J
authors: ('zaygee', 'hoan')
name: java
price: 11$
puhlisher: zaygee
id(b1) == id(b2): False
"""