设计模式 原型模式

原型模式用于创建对象的副本。 这种模式非常有用,特别是当从头开始创建对象的成本很高时。
与builder , factory和abstract factory模式相比,它不会从头开始创建对象,而是会克隆/重新创建它。 与单例模式相比,它创建一个实例的多个副本,而单例必须确保仅存在一个。

想象一下一个对象的场景,要创建该对象需要非常耗费资源的方法。 它可以是具有许多联接的数据库查询,甚至可以是联合搜索的结果。
我们希望这些数据通过各种算法使用一种算法处理一个线程。 每个线程都应拥有其原始实例的副本,因为使用同一对象将导致结果不一致。

因此,我们有一个表示搜索结果的接口。

package com.gkatzioura.design.creational.prototype;public interface SearchResult {SearchResult clone();int totalEntries();String getPage(int page);
}

并且我们将FederatedSearchResult实现为SearchResult。

package com.gkatzioura.design.creational.prototype;import java.util.ArrayList;
import java.util.List;public class FederatedSearchResult implements SearchResult {private List<String> pages = new ArrayList<String>();public FederatedSearchResult(List<String> pages) {this.pages = pages;}@Overridepublic SearchResult clone() {final List<String> resultCopies = new ArrayList<String>();pages.forEach(p->resultCopies.add(p));FederatedSearchResult federatedSearchResult = new FederatedSearchResult(resultCopies);return federatedSearchResult;}@Overridepublic int totalEntries() {return pages.size();}@Overridepublic String getPage(int page) {return pages.get(page);}
}

因此,我们可以使用clone方法并根据需要创建一个非常昂贵的对象的数量创建多个副本。

您可以在github上找到源代码。

另外,我还编写了备忘单,其中包含“创作设计模式”的摘要。 在链接中注册以接收它。

翻译自: https://www.javacodegeeks.com/2018/03/creational-design-patterns-prototype-pattern.html

设计模式 原型模式

设计模式 原型模式_创新设计模式:原型模式相关推荐

  1. netflix 模式创新_创新设计模式:单例模式

    netflix 模式创新 单例设计模式是一种软件设计模式,用于将类的实例化限制为一个对象. 与其他创建设计模式(例如抽象工厂 , 工厂和构建器模式)相比,单例将创建一个对象,但也将负责,因此该对象只有 ...

  2. netflix 模式创新_创新设计模式:工厂模式

    netflix 模式创新 以前,我们对创建模式进行了介绍,并使用抽象工厂模式来创建对象族. 下一个模式是Factory模式 . 当涉及到Java时,工厂模式是最常用的模式之一. 那么工厂模式到底是什么 ...

  3. 抽象工厂模式设计模式_创新设计模式:抽象工厂模式

    抽象工厂模式设计模式 抽象工厂模式是一种创新模式,是与构建器和工厂模式一起最受欢迎的模式之一. 使用创建模式是为了创建对象,而不是直接使用构造函数创建对象. 抽象工厂模式提供了一种封装一组具有共同主题 ...

  4. 设计模式 工厂方法_使用工厂方法模式设计最佳实践

    设计模式 工厂方法 在前面的"设计模式"示例中,我们解释了当今常用的"工厂"模式. 在本节中,我们将了解具有更多抽象的更高级的解决方案. 该模式称为工厂方法设计 ...

  5. 设计模式复合使用_结构设计模式:复合模式

    设计模式复合使用 以前,我们检查了适配器模式的用例和桥接模式. 我们将在本文中研究的模式是复合模式. 通过遵循复合模式,我们可以将对象"组成"为代表整个部分层次结构的树结构,因此客 ...

  6. python继承方式是基于原型吗_[译] 为什么原型继承很重要

    五天之前我写了一个关于ES6标准中Class的文章.在里面我介绍了如何用现有的Javascript来模拟类并且介绍了ES6中类的用法,其实它只是一个语法糖.感谢Om Shakar以及Javascrip ...

  7. java 桥接模式_《JAVA与模式》之桥接模式

    桥接模式是一种结构型模式,它主要应对的是:由于实际的需要,某个类具有两个或两个以上的维度变化,如果只是用继承将无法实现这种需要,或者使得设计变得相当臃肿. 桥接模式的做法是把变化部分抽象出来,使变化部 ...

  8. 小米6怎么解除温控_小米6性能模式_小米6性能模式怎么关

    小米6性能模式怎么关_小米手机6_MIUI论坛 1080x1920 - 201KB - PNG 小米6性能模式没了 720x1280 - 32KB - JPEG 小米6怎么没有性能模式了_开发者交流_ ...

  9. java严格模式_“use strict” 严格模式使用(前端基础系列)

    ECMAscript5添加一种严格模式的运行模式("use strict"),让你的js语句在更加严格的环境下进行运行: 一.主要作用: 消除版本javascript中一些不合理及 ...

最新文章

  1. 为什么“不懂数据结构与算法”的程序员一定走不远?
  2. LSTM还没「死」!
  3. ES6 箭头函数易出错细节
  4. 从大学入门到研究生拿大厂offer,必须看的数据结构与算法书籍推荐,不好不推荐!
  5. 【opencv4】opencv视频教程 C++(opencv教程)2、加载imread()(以灰度加载),修改,保存图像
  6. windows下客户端连接上马上会断开连接_Tunneller VS DCOM,稳定性更高的连接!
  7. 《Effective C#》Item 7:推荐使用不可改变的原子值类型
  8. 4.数据库数据导入查询数据库信息出现乱码问题
  9. NULL值的处理注意不同数据库区别
  10. 国产开源数据可视化套件Cboard使用
  11. DSP 程序远程升级 / Bootloader设计指南(五)—— FLASH擦写操作
  12. 如何去掉空格 oracle,oracle数据库中如何去除空格
  13. mysql嵌套查询是从外向内执行的吗_MySQL嵌套查询
  14. matlab仿真整流电路设计,基于Matlab GUI的整流电路仿真设计[图]
  15. 【Jmeter】Jmeter java.lang.IllegalAccessError: class com.github.weisj.报错
  16. 如何处理计算机显卡故障,显卡出现故障怎么办
  17. 中标麒麟linux模拟器,Kydroid安卓运行环境
  18. 如何计算机内存的品牌,如何检查计算机内存模块的品牌?如何检查计算机的内存...
  19. Ubuntu下源码编译VirtualBox六 —— 源码编译(5)
  20. PyCharm external tools

热门文章

  1. [luogu-P4299] 首都(并查集 + LCT动态维护树的重心 / 维护虚儿子信息)
  2. CF718E Matvey‘s Birthday(状压、bfs、暴力、分类讨论)
  3. CSP2019洛谷P5665:划分(单调队列,高精度)
  4. P3291-[SCOI2016]妖怪【凸壳】
  5. P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】
  6. P4096-[HEOI2013]Eden的博弈树
  7. jzoj6274-[NOIP提高组模拟1]梦境【贪心,堆】
  8. E - Escape from the Island(最短路+dp)
  9. 汇编语言(三十三)之四进制转十进制
  10. 分布式作业 Elastic-Job 快速上手指南