原型模式(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设计模式——原型模式相关推荐

  1. 精通python设计模式-浅谈Python设计模式 - 原型模式

    声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...

  2. python 设计模式 原型模式_python设计模式–原型模式

    套用书里的一个例子,两年前你写了一本书,现在你要在此书 的基础上修订一版,你会在新版本中加入一些最新的元素,但是与之前的书相比你有很多的地方其实是不用修改的,但是你又不想直接把上一版拿过来改,万一改的 ...

  3. 第六章 Caché 设计模式 原型模式

    文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...

  4. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  5. Python设计模式-状态模式

    Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...

  6. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  7. Python设计模式-解释器模式

    Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...

  8. Python设计模式-命令模式

    Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...

  9. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

最新文章

  1. 如何构建优雅的ViewController
  2. 重新理解@Resource注解
  3. 什么软件可以测试电脑硬件兼容性,Windows 7常用48款软件兼容性测试
  4. Java String trim()方法示例
  5. TypeScript算法专题 - blog1.基于TypeScript语言的单链表实现
  6. 汇编语言数据段查找ASCII码并回显
  7. MyEclipse 10.7(版本:eclipse 3.7.x-Indigo系列)安装activiti-eclipse-plugin插件(流程设计器)...
  8. Intel® QAT 助力Nginx压缩处理
  9. OpenGL中的glutInitDisplayMode()函数的理解
  10. Android基础入门教程——4.1.1 Activity初学乍练
  11. 小菜鸡跟着小破站黑马程序员学习JAVA的真实经历、感受与收获
  12. java halt_System.exit和Runtime halt区别
  13. ddr2之OCD、ODT和Post CAS技术
  14. 电脑变卡DOS解决方案
  15. 安全教育进社区:VR体验禁毒、防火、防盗骗
  16. iOS 手势的使用方法(一)
  17. YOLO train.txt创建
  18. win10系统无法加载操作系统且自动恢复失败的解决方案
  19. ubuntu卸载软件方法
  20. 如何使用Carthage

热门文章

  1. 软件测试期末复习知识点(第三章、第四章)
  2. vue源码尝试mvvc模式实现
  3. 创建带用户认证的docker私有仓库与管理
  4. java计算机毕业设计vue健康餐饮管理系统设计与实现源码+mysql数据库+系统+lw文档+部署
  5. N76E003 WKT 10K IRC偏差
  6. 批量修改文件名,我3分钟就搞定了
  7. 数据库嵌套循环查询联系——1.查询选修了课程号为“3”的学生姓名和系别、4.查询其它系中‘2‘号课程比信息系所有学生分数高的学生学号和姓名、6.查询每门课程中低于该课程平均成绩的学生学号和姓名
  8. 2017-2018 ACM-ICPC Asia East Continent League Final (ECL-Final 2017)
  9. HTML 初学制作网页遇到问题的解决方法
  10. 每天学一点图像处理--位深度