原型模式定义如下:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
进行clone操作后,新对象的构造函数没有被二次执行,新对象的内容是从内存里直接拷贝的。
优点:
1、性能极佳,直接拷贝比在内存里直接新建实例节省不少的资源;
2、简化对象创建,同时避免了构造函数的约束,不受构造函数的限制直接复制对象,是优点,也有隐患,这一点还是需要多留意一些。
使用场景:
1、对象在修改过后,需要复制多份的场景。如本例和其它一些涉及到复制、粘贴的场景;
2、需要优化资源的情况。如,需要在内存中创建非常多的实例,可以通过原型模式来减少资源消耗。此时,原型模式与工厂模式配合起来,不管在逻辑上还是结构上,都会达到不错的效果;
3、某些重复性的复杂工作不需要多次进行。如对于一个设备的访问权限,多个对象不用各申请一遍权限,由一个设备申请后,通过原型模式将权限交给可信赖的对象,既可以提升效率,又可以节约资源。
缺点
1、深拷贝和浅拷贝的使用需要事先考虑周到;
进行clone操作后,新对象的构造函数没有被二次执行,新对象的内容是从内存里直接拷贝的。
优点:
1、性能极佳,直接拷贝比在内存里直接新建实例节省不少的资源;
2、简化对象创建,同时避免了构造函数的约束,不受构造函数的限制直接复制对象,是优点,也有隐患,这一点还是需要多留意一些。
使用场景:
1、对象在修改过后,需要复制多份的场景。如本例和其它一些涉及到复制、粘贴的场景;
2、需要优化资源的情况。如,需要在内存中创建非常多的实例,可以通过原型模式来减少资源消耗。此时,原型模式与工厂模式配合起来,不管在逻辑上还是结构上,都会达到不错的效果;
3、某些重复性的复杂工作不需要多次进行。如对于一个设备的访问权限,多个对象不用各申请一遍权限,由一个设备申请后,通过原型模式将权限交给可信赖的对象,既可以提升效率,又可以节约资源。
缺点
1、深拷贝和浅拷贝的使用需要事先考虑周到;
2、某些编程语言中,拷贝会影响到静态变量和静态函数的使用。
流程图:
Python代码实现:
"""
prototype 原型模式
"""
# 图层对象
class simpleLayer:
background=[0,0,0,0]
content="blank"
def getContent(self):
return self.content
def getBackgroud(self):
return self.background
def paint(self,painting):
self.content=painting
def setParent(self,p):
self.background[3]=p
def fillBackground(self,back):
self.background=back
# 可以用复制的方法来实现,而复制(clone)这个动作,就是原型模式的精髓
from copy import copy, deepcopy
class simpleLayer:
background=[0,0,0,0]
content="blank"
def getContent(self):
return self.content
def getBackgroud(self):
return self.background
def paint(self,painting):
self.content=painting
def setParent(self,p):
self.background[3]=p
def fillBackground(self,back):
self.background=back
def clone(self):
return copy(self)
def deep_clone(self):
return deepcopy(self)
# 新建图层,填充蓝底并画一只狗,
if __name__=="__main__":
# 浅拷贝后,直接对拷贝后引用(这里的数组)进行操作,原始对象中该引用的内容也会变动。
dog_layer=simpleLayer()
dog_layer.paint("狗")
dog_layer.fillBackground([0,0,255,0])
print ("原始的背景:", dog_layer.getBackgroud ())
print ("原始的绘画:", dog_layer.getContent ())
another_dog_layer=dog_layer.clone()
another_dog_layer.setParent (128)
another_dog_layer.paint ("小狗")
print ("原始的背景:", dog_layer.getBackgroud ())
print ("原始的绘画:", dog_layer.getContent ())
print ("原始的背景:", another_dog_layer.getBackgroud ())
print ("原始的绘画:", another_dog_layer.getContent ())
print("---------------------------------------")
# 深拷贝后,其对象内的引用内容也被进行了复制。
dog_layer=simpleLayer()
dog_layer.paint("狗")
dog_layer.fillBackground([0,0,255,0])
print ("原始的背景:", dog_layer.getBackgroud ())
print ("原始的绘画:", dog_layer.getContent ())
another_dog_layer=dog_layer.deep_clone()
another_dog_layer.setParent (128)
another_dog_layer.paint ("小狗")
print ("原始的背景:", dog_layer.getBackgroud ())
print ("原始的绘画:", dog_layer.getContent ())
print ("原始的背景:", another_dog_layer.getBackgroud ())
print ("原始的绘画:", another_dog_layer.getContent ())
原文:https://yq.aliyun.com/articles/70451?spm=a2c4e.11153940.blogcont280715.12.175692aaXuwOAB

本文详细介绍了原型模式的概念及其在Python中的具体实现方式。原型模式通过复制已有实例来创建新对象,适用于需要频繁复制对象的场景。文章还探讨了浅拷贝与深拷贝的区别及其应用场景。

2077

被折叠的 条评论
为什么被折叠?



