如果有分身术,你会想干嘛?一个上班一个打游戏一个学习一个帮你做家务。。。这种克隆的梦想谁都有过。当然,现实生活中还不能完全实现这个梦想,但是程序可以啊!程序的克隆是简单的,因为它天生就具备方便复制的特点。在程序设计中,也有一种思想来源于克隆这一概念,就是克隆模式。

究竟什么是克隆模式呢?

用原型实例指定要创建对象的种类,并通过拷贝这些原型的属性来创建新的对象。通过拷贝自身的属性来创建一个新对象的过程叫作 克隆模式(Clone)。

克隆模式的核心就是一个 clone 方法,clone 方法的功能就是拷贝父本的所有属性。主要包括两个过程:

  • 分配一块新的内存空间给新的对象。

  • 拷贝父本对象的所有属性。

浅拷贝和深拷贝浅拷贝:只拷贝引用类型对象的指针(指向),而不拷贝引用类型对象指向的值;深拷贝:可以同时拷贝引用类型对象及其指向的值。引用类型:对象本身可以修改,Python 中的引用类型有列表(List)、字典(Dictionary)、类对象。Python 在赋值的时候默认是浅拷贝。

但通过克隆的方式创建对象时,浅拷贝往往是很危险的,因为如果这个类有引用类型的属性时,一个对象的改变会引起另一个对象也改变。而深拷贝就能对一个对象的属性进行完全拷贝,这样两个对象之间就不会相互影响了,你改你的,我改我的。

在使用克隆模式时,除非一些特殊情况(如需求本身就要求两个对象一起改变),尽量使用深拷贝的方式(我们称其为 安全模式)。

克隆模式的模型抽象代码框架

克隆模式非常简单,我们可以对它进行进一步的重构和优化,抽象出克隆模式的框架模型。

类图

Clone 是克隆模式的基类,SubClassA 和 SubClassB 是具体的实现类。

Python 中由于有 copy 模块的支持,因此克隆模式实现起来非常简单,只有两个方法:深拷贝克隆 deepClone 和浅拷贝克隆 clone,大部分情况下会用深拷贝的方式。

克隆模式的设计要点

克隆模式也叫原型模式,应用场景非常广泛。在 Java 中与基类 Object 融为一体,可以随手就拿来用,只要 implements Cloneabble 接口就默认拥有了克隆的功能。而在 Python 中,克隆模式成为了语言本身的一部分,因为 Python 中对象的赋值就是一个浅拷贝的过程。但还是要区别浅拷贝和深拷贝,除非一些特殊情况,还是使用深拷贝为佳。

克隆模式的优缺点

优点:

  • 克隆模式通过内存拷贝的方式进行复制,比 new 的方式创建对象性能更好。

  • 通过深拷贝的方式,可以方便地创建一个具有相同属性和行为的另一个对象,特别是对于复杂对象,方便性尤为突出。

缺点:

  • 通过克隆的方式创建对象, 不会执行类的初始化函数(_init_)。这不一定是缺点,但大家使用的时候需要注意这一点。

应用场景

  • 如果创建新对象(如复杂对象)成本较高,我们可以利用已有的对象进行复制来获得。

  • 类的初始化需要消耗非常多的资源时,如需要消耗很多的数据、硬件等资源。

  • 可配合备忘录模式做一些备份的工作。

克隆模式暂时介绍到这里,想要了解更多上xue.cn可继续阅读。《人人都懂设计模式》中可以了解更多实际代码案例,让知识理解更透彻。现在可下载xue.cn app,利用碎片化时间就可以随时随地学习代码知识。

python实现小型搜索引擎设计_Python实现:设计克隆模式相关推荐

  1. python实现小型搜索引擎设计_基于JAVA的中小型饭店餐饮管理系统的设计与实现...

    好程序设计擅长JAVA(SSM,SSH,SPRINGBOOT).PYTHON(DJANGO/FLASK).THINKPHP.C#.安卓.微信小程序.MYSQL.SQLSERVER等,欢迎咨询 今天将为 ...

  2. python实现小型搜索引擎设计_推荐:为图像处理初学者设计的100个问题(含python实现代码)...

    本文整理了图像处理初学者应该需要了解的100个基础问题,涉及读取.显示图像.操作像素.拷贝图像.保存图像.灰度化(Grayscale).二值化(Thresholding).大津算法.HSV 变换.减色 ...

  3. python 怎么做界面设计_python界面设计用什么

    python界面设计用什么?下面给大家介绍八款常用的界面设计的框架: Python 的 UI 开发工具包 Kivy Kivy是一个开源工具包能够让使用相同源代码创建的程序能跨平台运行.它主要关注创新型 ...

  4. python支持面向对象设计_python 面向对象设计

    从函数引出面向对象设计: 举这样一个例子: 歌手唱歌 : singer1={ 'name':'王菲', 'gender':'女', 'type':'歌手',} def singing(singer): ...

  5. python爬虫设计_python爬虫设计(刷访问量,赞)

    需要准备的工具: 刷博客访问量的原理是:打开一次网页博客访问量就增加一次.(新浪,搜狐等博客满足这个要求) count.py import webbrowser as web import time ...

  6. python文档字符串格式_Python字符串及文本模式方法详解

    一.你想在字符串中搜索和匹配指定的文本模式 遗漏点:re模块其实也是帮助我们进行字符串处理的重要工具,我之前总是想着用内建的函数来处理,其实如果是复杂的文本和数据结构,re模块能帮助我们处理很多信息. ...

  7. python连接数据库实现登录注册_python实现非数据库模式的用户注册和登录

    码农公社  210.net.cn  210= 1024  10月24日一个重要的节日--码农(程序员)节 python面向函数编程,模拟用户注册和登录. 由以下两个文件来实现: 1.user.txt文 ...

  8. python三层设计_python 三层架构说明

    原博文 2017-04-03 10:22 − python 三层架构说明 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:表现层(Presentati ...

  9. python课程设计博客网_python 课程设计

    原博文 2019-12-09 14:56 − 泉州信息工程学院 软件学院 课程设计报告书 课 程 名: python课程设计 课程设计项目名称: &nb... 相关推荐 2019-09-28 ...

  10. c++ 模板类实现堆栈实验报告_编译原理——小型类C编译器的设计和实现(生成8086汇编代码)之1:问题定义以及总体功能...

    前面花了两篇文章来介绍词法分析和语法分析,接下来才是比较有意思的部分--一个小型类C编译器的设计和实现(其实是编译原理的课程设计啦!~)我用的是python2.7.13+PyQt来做的...事实上,正 ...

最新文章

  1. 全球自动驾驶汽车发展指数哪家强?美德领衔,中国第七
  2. 【❤️算法系列之顺序二叉树的实现(前序遍历、中序遍历、后序遍历)❤️】
  3. vs2013 无法打开 源 文件 SDKDDKVer.h
  4. jvm jinfo 参数_jinfo:JVM运行时配置的命令行浏览
  5. 微信搜一搜又推出了新功能!搜“医保码”直达医保页面
  6. 2019帝豪gs装软件_继悬浮式车顶之后,2019年这些设计将会成为主流!
  7. 【Shell】检查字符串大小
  8. svn 回退/更新/取消至某个版本命令详解
  9. 基于SPM8或CAT12进行的VBM分析
  10. word无法在公式编辑器中输入字符
  11. Uvalive 5713 - Qin Shi Huang's National Road System(枚举+最小瓶颈路)
  12. mysql内表和外表_内表查询用到外表
  13. 微软行星云计算Planetary Computer——previsa南美洲亚马逊雨林森林损坏系统AI智能评估
  14. R语言 指定列缺失值定值填充
  15. H3C路由器交换机配置 操作系统介绍
  16. php 多版本 安装包下载,wamp 安装多版本php
  17. 渗透测试工程师都需要什么工具呢?网络安全(三)
  18. 华为p20有没有计算机,华为P20评测:AI加持,性能出众
  19. 去除前后空白字符(包含半角空格,全角空格)
  20. Oracle VM VirtualBox 不可用

热门文章

  1. selenium.common.exceptions.WebDriverException: Message: Can't load the profile.
  2. Nginx实战基础篇七 最新源码包通过脚本部署LAMP搭建Discuz论坛
  3. 一年复一年,又单身到了光棍节
  4. Mac MySQL重置Root密码
  5. React native真机调试
  6. js高级学习笔记(b站尚硅谷)-13-作用域链
  7. feign session 调用_Feign调用session丢失解决方案
  8. 如何把静态成员导出_dll导入导出及local vftable问题
  9. 电脑中的打印驱动程序如何打包_旧驱动程序会教您如何处理笔记本电脑上的黑屏...
  10. 最新sfc模拟器安卓汉化版_卡车模拟器山货运卡车3D游戏安卓最新版 v1.0 卡车模拟器山货运卡车3D游戏下载...