原型模式(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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用