设计模式:原型模式
前言
来啦老铁!
笔者正在学习常见的设计模式,且将设计模式系列学习文章归入 “设计模式学习” 专题,赶快关注专题一起学习吧!
今天我们继续学习:
-
原型模式
备注:笔者的学习资料大部分来源于:菜鸟教程;
学习路径
- 原型模式简介;
- 原型模式代码实现;
- 原型模式优缺点分析;
- 原型模式使用场景介绍;
1. 原型模式简介;
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
以上来自:菜鸟教程
2. 原型模式代码实现;
我们以操作客户信息为例。
1. 创建一个基类,如:prototype.py
class Prototype:
def clone(self):
pass
def deep_clone(self):
pass
2. 创建一个客户类,如:customer.py
from copy import copy, deepcopy
from prototype import Prototype
class Customer(Prototype):
def __init__(self):
self.name = ''
self.age = ''
self.address = ''
def set_name(self, name):
self.name = name
def set_age(self, age):
self.age = age
def set_address(self, address):
self.address = address
def display(self):
print("name:", self.name)
print("age:", self.age)
print("address:", self.address)
def clone(self):
return copy(self)
def deep_clone(self):
return deepcopy(self)
if __name__ == '__main__':
customer_1 = Customer()
customer_1.set_name("AAA")
customer_1.set_age("18")
customer_1.set_address("XM")
customer_2 = customer_1.clone()
customer_1.display()
print("------")
customer_2.display()
print("=============")
customer_2.set_name("BBB")
customer_2.set_address("FJ")
customer_1.display()
print("------")
customer_2.display()
print("=============")
customer_3 = customer_1.clone()
customer_3.set_name("CCC")
customer_3.set_age("7")
customer_1.display()
print("------")
customer_2.display()
print("------")
customer_3.display()
print("=============")
3. 直接运行 Customer 类进行演示;
演示代码参考自:
- https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
- https://www.cnblogs.com/onepiece-andy/p/python_prototype_pattern.html
这就是一个简单的原型模式的例子,customer_2,customer_3 这 2 个对象不是通过直接创建对象生成的,而是通过浅克隆和深克隆完成的,如果 customer_1 这个对象的生成方式十分麻烦,那么通过浅克隆和深克隆,则可以显著提高性能~
3. 原型模式优缺点分析;
优点:
1、性能提高。
2、逃避构造函数的约束。
缺点:
1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
2、必须实现 Cloneable 接口。
4. 原型模式使用场景介绍;
何时使用:
1、当一个系统应该独立于它的产品创建,构成和表示时。
2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。
3、为了避免创建一个与产品类层次平行的工厂类层次时。
4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
应用实例:
1、细胞分裂。
2、JAVA 中的 Object clone() 方法。
使用场景:
1、资源优化场景。
2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
3、性能和安全要求的场景。
4、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
5、一个对象多个修改者的场景。
6、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
7、在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与 Java 融为浑然一体,大家可以随手拿来使用(Python 看着也是)。
好啦,原型模式看着很简单,但笔者使用较少,未来有机会实际使用后再更新文章,也欢迎大家提供更多原型模式的知识点分享给我,万分感谢~
如果本文对您有帮助,麻烦点赞、关注!
谢谢!