Python设计模式——原型模式
·
原型模式(Protoype)
也可以称为复制模式。用原型模式,本质就是克隆对象,所以在对象初始化操作比较复杂的情况下,很实用,这既隐藏了对象创建的细节,又能大大降低耗时,提高性能。
目的:
原型模式用于减少一个项目所需的类的数量。
对于许多差异较小的子类,原型模式通过复制一个"原型实例"并做少量修改,来替代声明多个子类。
应用场景:
当我们已有一个对象,并希望创建该对象的一个完整副本时,没必要创新创建对象,可以使用原型模式。一般当对象初始化操作比较复杂的情况下,当新的实例更容易通过一个旧实例衍生出来,可以使用原型模式。
优点:
原型模式用于创建复杂的和耗时的实例,复制一个已经存在的实例使程序运行更高效。
缺点:
每一个产品类都必须配置一个克隆方法,并且这个克隆方法需要对类的功能进行整体考虑。
对于原型模式而言,其中最主要的部分就是关于一个对象的复制,其中包含两个方面,1、浅复制;2、深复制
浅复制等于对象的引用,修改会影响到相关的对象
深复制就相当于两个完全独立的东西,互不影响。
python代码实现:
import copy
# 定义一个人的类
class Person():
def __init__(self, name, age, **info):
self.name = name
self.age = age
# 可以为实例添加其他额外属性,但必须是key:value格式的属性
self.__dict__.update(info)
# 当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据
def __str__(self):
myinfo = []
for i, v in self.__dict__.items():
myinfo.append(f'{i}:{v}\n')
return ''.join(myinfo)
class Prototype():
def __init__(self):
self.objects = dict() # 定义原型对象字典表
# 在原型字典表中注册原型对象
def register(self, sign, obj):
self.objects[sign] = obj
# 在原型字典表中删除原型对象
def destory(self, sign):
del self.objects[sign]
# 根据 id 在原型字典表中查找原型对象并克隆
def clone(self, sign, **atter):
obj1 = self.objects.get(sign)
if not obj1:
raise ValueError(f'你要拷贝的对象{sign}不存在: {sign}')
obj2 = copy.deepcopy(obj1) # clone关键在于深拷贝函数
obj2.__dict__.update(atter) # 新增的属性通过**atter传入并更新
return obj2
if __name__ == '__main__':
xiaoming = Person('xiaoming', 34, high='178')
prototype = Prototype()
prototype.register(1, xiaoming)
honghong = prototype.clone(1, name="honghong", age='19', birthday='2010-02-02')
print(xiaoming)
print(honghong)
# 输出两个Person对象是否是相同的id值
print(f"id xiaoming : {id(xiaoming)} != id honghong : {id(honghong)}")
# ====================结果输出========================
name:xiaoming
age:34
high:178
name:honghong
age:19
high:178
birthday:2010-02-02
id xiaoming : 1895679147760 != id honghong : 1895679147480
更多推荐
所有评论(0)