设计模式 - 原型模式
原型模式(Prototype Pattern)主要用于复制、克隆;
如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型、公用部分)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间和空间的目的。
为什么使用原型模式
- 减少对象实例化带来的损耗
- 提高对象的复用性(共用部分)
- 对有大量计算和cpu、io等操作,但是可以直接使用操作后的值(类似缓存)生成的对象复用减少重复计算
原型模式缺点
需要为每一个类配备一个克隆方法,而且该克隆方法位于一个类的内部,当对已有的类进行改造时,需要修改源代码,违背了“开闭原则”。
原型模式的实现方式
目前原型模式主要的实现方式有两种:
- 浅拷贝
- 深拷贝
主要区别在于:
- 浅拷贝:它只会拷贝对象中的不可变类型(比如,int、string),以及可变类型的内存地址,不会递归地可变类型本身。
- 深拷贝:无论可变类型还是不可变类型,会一直递归拷贝一份完全新的。
⚠️:深拷贝比浅拷贝需要更多的资源,按照实际场景选择,并没有哪种一定更好。以下几个是深、浅拷贝的主要应用场景:
- 当我们克隆出来的对象,我们希望不要互相影响时,就必须使用深拷贝。
- 当互相影响无所谓时,甚至说克隆出来的对象,必须共享这些可变变量时,或者为了提升性能,就可以使用浅拷贝。
代码实现
首先我们创建原型模式中的原型,并分别通过浅拷贝及深拷贝的方式实现原型模式。
通过一个广东省下的市的例子来实现原型模式的讲解,每一个省下都有很多个市,这些市共享相同的一些属性(属于同样的省),不用每次实例化市的对象时重复创建共享的省属性。
# 原型
class GuangDongProperty:def __init__(self):self.name = "GuangDong"self.loc = "south east"self.pro_area = "xxxx cubic meters"
浅拷贝实现
python实现浅拷贝原型模式:
import copyclass CityProtoType:def __init__(self, obj):self.obj = obj()def clone(self, **city_dict):obj = copy.copy(self.obj)obj.__dict__.update(city_dict)return obj
深拷贝实现
python实现深拷贝原型模式:
import copyclass CityProtoType:def __init__(self, obj):self.obj = obj()def clone(self, **city_dict):obj = copy.deepcopy(self.obj)obj.__dict__.update(city_dict)return obj
总结
原型模式作为一种快速创建大量相同或相似对象的方式,在软件开发中应用较为广泛,一个典型的应用场景就是业务数据库进行增量更新。
设计模式 - 原型模式相关推荐
- 设计模式 原型模式_创新设计模式:原型模式
设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...
- 设计模式 原型模式_设计模式:原型
设计模式 原型模式 创新设计模式之一是原型设计模式 . 尽管原型是创造模式,但它在概念上与其他模式有所区别. 我的意思是原型在某种意义上创造了自己. 我将在下面解释. 原型模式的所有魔力都基于Java ...
- 设计模式 原型模式_原型设计模式:创建另一个小车
设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...
- Java常用设计模式————原型模式(一)
介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...
- 第六章 Caché 设计模式 原型模式
文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...
- C++设计模式——原型模式(Prototype Pattern)
C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...
- 设计模式---原型模式(Prototype Pattern)
在编程中有时候我们会发现,当我们需要一个实例,可是这个实例的创建过程十分复杂,在执行过程中 会消耗大量的时间,同时创建第一个实例和创建第二个时间的初始化信息并未改变.在此种情况下,直接New 一个实例 ...
- 精通python设计模式-浅谈Python设计模式 - 原型模式
声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...
- [设计模式]原型模式
简介 原型模式 (Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式是一种对象创建型模式 (可参考 设计模式 创建型模式). 结构 图-原型模式结构图 Pr ...
- Java设计模式——原型模式
概述 原型模式是为了解决一些不必要的对象创建过程.当Java JDK中提供了Cloneable接口之后,原型模式就变得异常的简单了.虽然由于Cloneable的引入使用程序变得更简单了,不过还是有一些 ...
最新文章
- [转载]使用C#的BitmapData
- soapUI快速入门
- 未授权用户在此计算机上的的请求登陆类型
- 在Linux系统里安装Virtual Box的详细步骤
- “铜死亡”顶级研究文献解读
- 嵌入式C语言基础(三)
- Gui+jdbc+mysql实现图书管理
- c语言标准库函数system,C 库函数
- 解决uni-app开发中iphoneX下背景不能全屏铺满的问题
- 你们公司的业务是部署在什么平台?
- c语言回溯法解决倒桥本分数式,回溯法 经典题目 八皇后 桥本分数
- 【阿里巴巴/腾旭】mysql面试题汇总
- linux下的etc是什么意思
- 又来神器推荐嘞xshell与winSCP
- python exec函数_Python中的exec函数
- CTF crypto(一)一些简单的编码与加密
- Gitpod---可以在线运行Github上代码的IDE
- 带emoji表情的react输入框组件
- 使用ARP欺骗, 截取局域网中任意一台机器的网页请求,破解用户名密码等信息
- 图像处理算法(二)---图像常用颜色空间
热门文章
- android 取mac地址,Android手机获取Mac地址的几种方法,androidmac
- 打印机无端端用不了,黄色感叹号
- Row Column
- 像个黑客一样在网络上来无影去无踪之IP代理实践篇
- 豌豆淘喜迎三大国际品牌入驻,一分钟了解三品牌齐聚豌豆淘
- 每日总结 11.24
- 从学习SaaS引申学习的一些关键词概念
- 原生html5网页设计,HTML5网页设计教程
- LeetCode-236的解法和延伸
- 电子科技大学计算机男女比例,我国最牛的电子科技类985大学,男女比例失调,男生大多打光棍...