原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。
- 原型模式包含三个角色:抽象原型类是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类;具体原型类实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象;客户类让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。
- 由于客户类针对抽象原型类编程,因此用户可以根据需要选择具体原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。
- 原型模式的主要优点是简化复杂对象的创建过程,扩展性较好,还可以使用深克隆的方式保存对象状态,在需要的时候使用可辅助实现撤销操作。主要缺点是需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了 “ 开闭原则 ”;在实现深克隆时需要编写较为复杂的代码。
- 原型模式的适用情况包括:创建新对象成本较大,新的对象可以通过原型模式对已有对象进行复制来获得;如果系统要保存对象的状态;需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态。
# -*- coding:utf-8 -*- import copy class Person: '''定义原型类,用于被复制''' def __init__(self): self.name = None self.sex = None self.age = None def run(self): print('name:%s, sex:%s, age:%s' %(self.name, self.sex, self.age)) class Prototype: '''定义复制类,用于复制原型类,并更新类中的属性''' def __init__(self, obj): '''接收需要复制的类名,并实例化成对象''' self.obj = obj() def clone(self, **kwargs): '''深拷贝原型类,并更新参数''' copy_obj = copy.deepcopy(self.obj) copy_obj.__dict__.update(kwargs) return copy_obj test = Prototype(Person) p1 = test.clone(name='Mike', sex='Male', age=20) p2 = test.clone(name='Lucy', sec='Female', age=18) p1.run() p2.run()
结果:
name:Mike, sex:Male, age:20
name:Lucy, sex:None, age:18