原型模式(Prototype Pattern):属于创建型模式,它提供了一种创建对象的最佳方式。这种模式实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。

例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

意图: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

主要解决: 在运行期建立和删除原型。

何时使用: 1、当一个系统应该独立于它的产品创建,构成和表示时。 2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。 3、为了避免创建一个与产品类层次平行的工厂类层次时。 4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

如何解决: 利用已有的一个原型对象,快速地生成和原型对象一样的实例。

关键代码: 1、实现克隆操作。 2、原型模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些"易变类"拥有稳定的接口

优点: 1、性能提高。 2、逃避构造函数的约束

缺点: 1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。 2、必须实现 Clone接口。

注意事项:与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝采用copy.copy()实现,而深拷贝采用copy.deepcopy()实现。

应用实例: 夏天到了,我们超市的水果限时促销活动异常火爆,而这些促销的水果面临高并发的负载压力,我们采用原型模式为这些参与促销的水果提供更加高速地访问。

那我们一起使用建造者模式,实现一个促销水果的管理项目吧!(づ。◕ᴗᴗ◕。)づ

实现的思路:

  • 项目的核心包括3个部分:FruitCache(促销水果的缓冲区)负责生产参与促销的水果Fruit(参与促销的水果模型)负责提供参与促销水果的原型信息和功能Grape(葡萄类)、Hami_Melon(哈密瓜类)、Orange(橘子类)是具体的水果实现

项目的UML用例图如下:

实现的代码如下:

from copy import deepcopyclass Fruit:def __init__(self, weight=0.0, package=False):self.name = Noneself.weight = weightself.price = 0self.package = packageself.promotion_price = 0def show(self):pack = "袋装"if self.package:pack = "盒装"print("水果名称:%s\n重量:%.2f(千克)\n价格:%.2f(元/千克)\n包装方式:%s\n原需支付的金额:%.2f(元)\n限时促销价:%.2f(元)!!!"% (self.name, self.weight, self.price, pack, self.weight * self.price, self.promotion_price))print("-*-" * 15)def deep_clone(self):return deepcopy(self)class Grape(Fruit):def __init__(self, weight=0.0, package=False):super().__init__(weight, package)self.name = "葡萄"self.price = 18.0self.promotion_price = 28.99class Hami_Melon(Fruit):def __init__(self, weight=0.0, package=False):super().__init__(weight, package)self.name = "哈密瓜"self.price = 22.0self.promotion_price = 39.99class Orange(Fruit):def __init__(self, weight=0.0, package=False):super().__init__(weight, package)self.name = "橘子"self.price = 12.5self.promotion_price = 18.88class FruitCache:def __init__(self):self.fruits = []def load_cache(self):grape_1 = Grape(2.5, True)self.fruits.append(grape_1)grape_2 = grape_1.deep_clone()self.fruits.append(grape_2)hami_melon = Hami_Melon(3.2, False)self.fruits.append(hami_melon)orange = Orange(2.6, True)self.fruits.append(orange)return self.fruitsif __name__ == '__main__':use = FruitCache().load_cache()print("-*-" * 15)for item in use:item.show()

相关的测试用例:

本文关于设计模式的讲解思想,参考链接:原型模式

关于深度拷贝和浅拷贝的用法讲解,参考链接:十分钟!彻底弄懂Python深拷贝与浅拷贝机制

往期推荐: 点这里->Python:水果与设计模式-建造者模式

往期推荐: 点这里->Python:水果与设计模式-单例模式

往期推荐: 点这里->Python:水果与设计模式-抽象工厂模式

往期推荐: 点这里->Python:水果与设计模式-工厂模式

python:水果与设计模式-原型模式相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. Python设计模式——原型模式

    原型模式(Protoype) 也可以称为复制模式.用原型模式,本质就是克隆对象,所以在对象初始化操作比较复杂的情况下,很实用,这既隐藏了对象创建的细节,又能大大降低耗时,提高性能. 目的: 原型模式用 ...

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

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

最新文章

  1. [No000018C]Vim清除上次的搜索高亮结果-Vim使用技巧(1)
  2. sd卡 写卡阻塞_Sony a7r4写卡速度测试
  3. 嵌入式操作系统内核原理和开发(内存分配算法)
  4. 不同国家的视力表也不一样!| 今日趣图
  5. char p[]与char *p的区别
  6. C++ primer第六章6.5函数的学习 之特殊用途的语言特性
  7. rand函数怎么避免重复_Excel常用的计算统计函数
  8. 黑马博客——详细步骤(二)项目功能的实现之登录功能
  9. 8.4文件系统的管理与挂载2
  10. linux服务器备份,Linux服务器上如何备份
  11. 【飞桨PaddleSpeech语音技术课程】— 多语言合成与小样本合成技术应用实践
  12. 树莓派系统迁移到移动硬盘
  13. Lattice diamond软件中的Clarity Designer 与 IPexpress切换
  14. 海康流媒体客户端开发
  15. 中国海洋科技发展迅速 海洋重器世界领先
  16. 雅思口语考官常问的100个话题整理-自己整理
  17. 数据库系统的核心:数据模型
  18. 撩人飙新意,美汁源首次转战“AR微电影”,要你变身当“导演”
  19. GYM 101350D. Magical Bamboos
  20. Vue3封装Video.js组件(基于video.js)

热门文章

  1. jdk8 中英文版文档
  2. python实现微信接龙统计
  3. 【技术晨读】EAV or JSON
  4. iOS 真机测试错误解决An App ID with Identifier ...is not available
  5. php把图片合成视频,如何把照片做成视频 照片音乐视频制作 并插入几段短视频片段...
  6. java: 找不到符号 符号: 方法 getResourceAsStream(java.lang.String) 位置: 类 com.alibaba.druid.support.loggi
  7. [2001-2003美/新等合拍经典奇幻大片][魔戒1-3][BD-RMVB][中英字幕/1280x720高清晰版]
  8. C# Excel导出超出65536行报错
  9. Qt 常用控件样式表及遇到的问题
  10. 货郎担问题java算法_经典算法(1)---货郎担问题