Python设计模式——原型模式
原型模式(Protoype)
也可以称为复制模式。用原型模式,本质就是克隆对象,所以在对象初始化操作比较复杂的情况下,很实用,这既隐藏了对象创建的细节,又能大大降低耗时,提高性能。
目的:
原型模式用于减少一个项目所需的类的数量。
对于许多差异较小的子类,原型模式通过复制一个"原型实例"并做少量修改,来替代声明多个子类。
应用场景:
当我们已有一个对象,并希望创建该对象的一个完整副本时,没必要创新创建对象,可以使用原型模式。一般当对象初始化操作比较复杂的情况下,当新的实例更容易通过一个旧实例衍生出来,可以使用原型模式。
优点:
原型模式用于创建复杂的和耗时的实例,复制一个已经存在的实例使程序运行更高效。
缺点:
每一个产品类都必须配置一个克隆方法,并且这个克隆方法需要对类的功能进行整体考虑。
对于原型模式而言,其中最主要的部分就是关于一个对象的复制,其中包含两个方面,1、浅复制;2、深复制
浅复制等于对象的引用,修改会影响到相关的对象
深复制就相当于两个完全独立的东西,互不影响。
python代码实现:
import copy# 定义一个人的类
class Person():def __init__(self, name, age, **info):self.name = nameself.age = age# 可以为实例添加其他额外属性,但必须是key:value格式的属性self.__dict__.update(info)# 当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据def __str__(self):myinfo = []for i, v in self.__dict__.items():myinfo.append(f'{i}:{v}\n')return ''.join(myinfo)class Prototype():def __init__(self):self.objects = dict() # 定义原型对象字典表# 在原型字典表中注册原型对象def register(self, sign, obj):self.objects[sign] = obj# 在原型字典表中删除原型对象def destory(self, sign):del self.objects[sign]# 根据 id 在原型字典表中查找原型对象并克隆def clone(self, sign, **atter):obj1 = self.objects.get(sign)if not obj1:raise ValueError(f'你要拷贝的对象{sign}不存在: {sign}')obj2 = copy.deepcopy(obj1) # clone关键在于深拷贝函数obj2.__dict__.update(atter) # 新增的属性通过**atter传入并更新return obj2if __name__ == '__main__':xiaoming = Person('xiaoming', 34, high='178')prototype = Prototype()prototype.register(1, xiaoming)honghong = prototype.clone(1, name="honghong", age='19', birthday='2010-02-02')print(xiaoming)print(honghong)# 输出两个Person对象是否是相同的id值print(f"id xiaoming : {id(xiaoming)} != id honghong : {id(honghong)}")# ====================结果输出========================
name:xiaoming
age:34
high:178name:honghong
age:19
high:178
birthday:2010-02-02id xiaoming : 1895679147760 != id honghong : 1895679147480
Python设计模式——原型模式相关推荐
- 精通python设计模式-浅谈Python设计模式 - 原型模式
声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...
- python 设计模式 原型模式_python设计模式–原型模式
套用书里的一个例子,两年前你写了一本书,现在你要在此书 的基础上修订一版,你会在新版本中加入一些最新的元素,但是与之前的书相比你有很多的地方其实是不用修改的,但是你又不想直接把上一版拿过来改,万一改的 ...
- 第六章 Caché 设计模式 原型模式
文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...
- Python设计模式-建造者模式
Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...
- Python设计模式-状态模式
Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...
- Python设计模式-备忘录模式
Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...
- Python设计模式-解释器模式
Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...
- Python设计模式-命令模式
Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...
- Python设计模式-策略模式
Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...
最新文章
- 如何构建优雅的ViewController
- 重新理解@Resource注解
- 什么软件可以测试电脑硬件兼容性,Windows 7常用48款软件兼容性测试
- Java String trim()方法示例
- TypeScript算法专题 - blog1.基于TypeScript语言的单链表实现
- 汇编语言数据段查找ASCII码并回显
- MyEclipse 10.7(版本:eclipse 3.7.x-Indigo系列)安装activiti-eclipse-plugin插件(流程设计器)...
- Intel® QAT 助力Nginx压缩处理
- OpenGL中的glutInitDisplayMode()函数的理解
- Android基础入门教程——4.1.1 Activity初学乍练
- 小菜鸡跟着小破站黑马程序员学习JAVA的真实经历、感受与收获
- java halt_System.exit和Runtime halt区别
- ddr2之OCD、ODT和Post CAS技术
- 电脑变卡DOS解决方案
- 安全教育进社区:VR体验禁毒、防火、防盗骗
- iOS 手势的使用方法(一)
- YOLO train.txt创建
- win10系统无法加载操作系统且自动恢复失败的解决方案
- ubuntu卸载软件方法
- 如何使用Carthage
热门文章
- 软件测试期末复习知识点(第三章、第四章)
- vue源码尝试mvvc模式实现
- 创建带用户认证的docker私有仓库与管理
- java计算机毕业设计vue健康餐饮管理系统设计与实现源码+mysql数据库+系统+lw文档+部署
- N76E003 WKT 10K IRC偏差
- 批量修改文件名,我3分钟就搞定了
- 数据库嵌套循环查询联系——1.查询选修了课程号为“3”的学生姓名和系别、4.查询其它系中‘2‘号课程比信息系所有学生分数高的学生学号和姓名、6.查询每门课程中低于该课程平均成绩的学生学号和姓名
- 2017-2018 ACM-ICPC Asia East Continent League Final (ECL-Final 2017)
- HTML 初学制作网页遇到问题的解决方法
- 每天学一点图像处理--位深度