原型模式(Prototype Pattern)主要用于复制、克隆;
如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型、公用部分)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间和空间的目的。
为什么使用原型模式
- 减少对象实例化带来的损耗
- 提高对象的复用性(共用部分)
- 对有大量计算和cpu、io等操作,但是可以直接使用操作后的值(类似缓存)生成的对象复用减少重复计算
原型模式缺点
需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了“开闭原则”。
原型模式的实现方式
目前原型模式主要的实现方式有两种:
- 浅拷贝
- 深拷贝
主要区别在于:
- 浅拷贝:它只会拷贝对象中的不可变类型(比如,int、string),以及可变类型的内存地址,不会递归地可变类型本身。
- 深拷贝:无论可变类型还是不可变类型,会一直递归拷贝一份完全新的。
⚠️:深拷贝比浅拷贝需要更多的资源,按照实际场景选择,并没有哪种一定更好。以下几个是深、浅拷贝的主要应用场景:
- 当我们克隆出来的对象,我们希望不要互相影响时,就必须使用深拷贝。
- 当互相影响无所谓时,甚至说克隆出来的对象,必须共享这些可变变量时,或者为了提升性能,就可以使用浅拷贝。
代码实现
首先我们创建原型模式中的原型,并分别通过浅拷贝及深拷贝的方式实现原型模式。
通过一个广东省下的市的例子来实现原型模式的讲解,每一个省下都有很多个市,这些市共享相同的一些属性(属于同样的省),不用每次实例化市的对象时重复创建共享的省属性。
# 原型
class GuangDongProperty:
def __init__(self):
self.name = "GuangDong"
self.loc = "south east"
self.pro_area = "xxxx cubic meters"
浅拷贝实现
python实现浅拷贝原型模式:
import copy
class CityProtoType:
def __init__(self, obj):
self.obj = obj()
def clone(self, **city_dict):
obj = copy.copy(self.obj)
obj.__dict__.update(city_dict)
return obj
深拷贝实现
python实现深拷贝原型模式:
import copy
class CityProtoType:
def __init__(self, obj):
self.obj = obj()
def clone(self, **city_dict):
obj = copy.deepcopy(self.obj)
obj.__dict__.update(city_dict)
return obj
总结
原型模式作为一种快速创建大量相同或相似对象的方式,在软件开发中应用较为广泛,一个典型的应用场景就是业务数据库进行增量更新。