原型模式(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

总结

原型模式作为一种快速创建大量相同或相似对象的方式,在软件开发中应用较为广泛,一个典型的应用场景就是业务数据库进行增量更新。

设计模式 - 原型模式相关推荐

  1. 设计模式 原型模式_创新设计模式:原型模式

    设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...

  2. 设计模式 原型模式_设计模式:原型

    设计模式 原型模式 创新设计模式之一是原型设计模式 . 尽管原型是创造模式,但它在概念上与其他模式有所区别. 我的意思是原型在某种意义上创造了自己. 我将在下面解释. 原型模式的所有魔力都基于Java ...

  3. 设计模式 原型模式_原型设计模式:创建另一个小车

    设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...

  4. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

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

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

  6. C++设计模式——原型模式(Prototype Pattern)

    C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...

  7. 设计模式---原型模式(Prototype Pattern)

    在编程中有时候我们会发现,当我们需要一个实例,可是这个实例的创建过程十分复杂,在执行过程中 会消耗大量的时间,同时创建第一个实例和创建第二个时间的初始化信息并未改变.在此种情况下,直接New 一个实例 ...

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

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

  9. [设计模式]原型模式

    简介 原型模式 (Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式是一种对象创建型模式 (可参考 设计模式 创建型模式). 结构 图-原型模式结构图 Pr ...

  10. Java设计模式——原型模式

    概述 原型模式是为了解决一些不必要的对象创建过程.当Java JDK中提供了Cloneable接口之后,原型模式就变得异常的简单了.虽然由于Cloneable的引入使用程序变得更简单了,不过还是有一些 ...

最新文章

  1. [转载]使用C#的BitmapData
  2. soapUI快速入门
  3. 未授权用户在此计算机上的的请求登陆类型
  4. 在Linux系统里安装Virtual Box的详细步骤
  5. “铜死亡”顶级研究文献解读
  6. 嵌入式C语言基础(三)
  7. Gui+jdbc+mysql实现图书管理
  8. c语言标准库函数system,C 库函数
  9. 解决uni-app开发中iphoneX下背景不能全屏铺满的问题
  10. 你们公司的业务是部署在什么平台?
  11. c语言回溯法解决倒桥本分数式,回溯法 经典题目 八皇后 桥本分数
  12. 【阿里巴巴/腾旭】mysql面试题汇总
  13. linux下的etc是什么意思
  14. 又来神器推荐嘞xshell与winSCP
  15. python exec函数_Python中的exec函数
  16. CTF crypto(一)一些简单的编码与加密
  17. Gitpod---可以在线运行Github上代码的IDE
  18. 带emoji表情的react输入框组件
  19. 使用ARP欺骗, 截取局域网中任意一台机器的网页请求,破解用户名密码等信息
  20. 图像处理算法(二)---图像常用颜色空间

热门文章

  1. android 取mac地址,Android手机获取Mac地址的几种方法,androidmac
  2. 打印机无端端用不了,黄色感叹号
  3. Row Column
  4. 像个黑客一样在网络上来无影去无踪之IP代理实践篇
  5. 豌豆淘喜迎三大国际品牌入驻,一分钟了解三品牌齐聚豌豆淘
  6. 每日总结 11.24
  7. 从学习SaaS引申学习的一些关键词概念
  8. 原生html5网页设计,HTML5网页设计教程
  9. LeetCode-236的解法和延伸
  10. 电子科技大学计算机男女比例,我国最牛的电子科技类985大学,男女比例失调,男生大多打光棍...