Python设计模式2(原型模式)
原型模式关注的是大量相同对象或相似对象的创建问题,意图在于通过复制一个已经存在的实例来获得一个新的实例,以避免重复创建此类实例带来的开销。被复制的实例就是这个“原型”,这个原型是可定制的。
一 浅拷贝与深拷贝
在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。
1 | import copy |
b = a是赋值操作符,所以a和b都是同一块地址的不同引用,无论a怎么变b和a的对象地址和元素地址始终指相同;
c = c=copy.copy(a)是浅拷贝,只拷贝可变元素的地址如这里的a[5],所以是浅层的拷贝,如果深层的数据变化 ,因为地址指向一样,所以也会发生变化;
d=copy.deepcopy(a) 是深拷贝,会递归拷贝所有对象(这里的拷贝意思是放入新的地址),所以地址都不一样
补充:1、列表切片拷贝属于浅拷贝 2、字典中的copy也是浅拷贝 3、列表作为函数参数传递也是浅拷贝
二、原型模式的实现
1 简单类图
原型模式的核心就是clone()函数,
2 使用举例
例子:
1 | import copy |
运行结果:
1 | Default |
3 实际应用
很多畅销书籍会经历多个版本的迭代。
有变化的信息:价格、长度(页数)以及出版日期。
但也有很多相似之处:作者、出版商以及描述该书的标签/关键词都是完全一样的。这表明从头创建一版新书并不总是最佳方式。
如果知道两个版本之间的诸多相似之处,则可以先克隆一份,然后仅修改新版本与旧版本之间的不同之处
1 | import copy |
三、总结
原型模式多用于对象创建比较麻烦的,且需要大量创建,但是对象属性只有一部分改变的类中,但是每个类都要有clone方法,如果项目过大就要在设计之前优先考虑了
四、参考文章
1 | https://blog.csdn.net/biheyu828/article/details/92798805 |