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

设计模式 原型模式

创建对象确实是一个耗时的过程,也是一件昂贵的事情。 因此,我们现在正冒险节省时间和金钱。 我们该怎么做?

克隆奇迹多莉

有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物。 好吧,我不想深入研究细节,但是关键是全部与克隆有关。 这是关于创建副本。

原型设计模式与这个现实示例非常相似。 这是“四个设计模式的帮派”的“创新设计模式”系列的另一部分。

因此,此模式通过克隆对象而不是与Factory模式不同的创建来工作。

何时使用此模式?

  • 创建对象的成本是昂贵还是复杂。
  • 尝试将应用程序中的类数保持在最低限度时
  • 在运行时添加或删除对象时
  • 当客户端应用程序不需要知道对象的创建,组成和表示时。
  • 需要与现有对象相似的对象

原型模式有什么作用?

原型模式允许通过复制现有实例来制作新实例。 原型模式会导致克隆的对象与原始对象不同。 克隆时,原始状态与克隆相同。 之后,每个对象可以经历状态改变。 我们可以修改对象以执行不同的事情。 唯一的好处是,客户端可以在不知道实例化哪个特定类的情况下创建新实例。

结构体:

原型类通过实现Cloneable接口并使用clone()方法声明一个用于克隆自身的接口。 具体原型实现了用于克隆自身的clone()方法。 客户端类通过要求Prototype克隆自己而不是使用new关键字来创建一个新对象。

原型图案结构

事件流以原始类(例如A类)已经初始化和实例化的方式工作。 这是因为我们不能按原样使用克隆。 我们需要在使用它之前实例化原始类(A类)。 然后,客户端向Prototype类请求与A类相同类型的新对象。根据所需对象类型的具体原型通过使用clone()方法克隆自身来提供对象。

设想一个场景,其中可能存在一些要求,我们必须从后端获取用户配置文件数据以进行多种处理,例如用户配置文件或角色等,而这些更改不会经常更改。 因此,我们可能不得不使用昂贵的数据库资源,连接和事务。 在这种情况下,我们可以将数据存储在单个调用中,并将其缓存在会话中以进行进一步处理。

在上面的示例中,UserProfile对象是将被克隆的主要对象。 UserProfile实现Cloneable接口。 BankDetails和Identity类从UserProfile类继承。 这些是具体的原型类。

我们引入了一个名为UserProfileRegistry的新类,该类可找到适当的UserProfile实例,然后将克隆适当地返回给客户端类。

原型模式示例

要在运行时创建另一个对象(要克隆的对象的真实副本)时,需要克隆()一个对象。 真实副本意味着新创建的对象的所有属性应与您要克隆的对象相同。 如果可以通过使用new实例化该类,则将获得一个具有所有属性作为其初始值的Object。 例如,如果您正在设计一个用于执行银行帐户交易的系统,那么您将想要制作一个保存您的帐户信息的对象的副本,对其进行交易,然后将原始对象替换为修改后的对象。 在这种情况下,您可能希望使用clone()而不是new。

有趣的 一点

  • 创意设计模式可以共存,例如,抽象工厂,构建器和原型可以在实现过程中使用单例模式,或者它们也可以单独工作。
  • 原型模式肯定需要初始化操作,但不需要子类化,但是Factory Method需要子类化,但不需要初始化操作。
  • 在银行交易昂贵的数据库查询中,这是有利的。 缓存可能会有所帮助,并且原型模式是对此情况的最佳解决方案,因为可以使用具有银行帐户信息或用户配置文件信息的对象的副本,对其进行事务处理,然后将原始对象替换为修改后的对象。
  • 上面的示例使用了浅克隆方法。 但是,我们也可以通过深度克隆来实现。 有关此主题的详细说明,请参见我们的文章: 深入研究克隆

优点:

  • 隐藏了创建对象的复杂性。
  • 客户可以在不知道对象类型的情况下获取新对象。
  • 减少子类化。

退税:

  • 使用原型的缺点是制作对象的副本有时会很复杂。
  • 具有循环引用其他类的类不能真正被克隆。

下载源代码:


参考: 原型设计模式:在Idiotechie博客上从我们的JCG合作伙伴 Mainak Goswami 创建另一个小车 。

翻译自: https://www.javacodegeeks.com/2012/11/prototype-design-pattern-creating-another-dolly.html

设计模式 原型模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验四:三角形判断

本次实验问题稍多,出租车计价一题逻辑比较简单,就是情况比较多,在多次尝试后才让程序成功运行。而三角形的判断一题中主要出现了以下几点错误 1.else 和 if 语句不搭配 2.对三角形成立的条件理解不正确(是任意两边之和大于第三…

电脑键盘上每个键的作用_眼看着淡出大众视野 键盘上Esc键的隐秘往事

众所周知,苹果一些新的Macbook产品线不仅取消了Esc键,而且还对通常用于多数计算机键盘的功能键布局进行了变更。它们有的被转移到了TouchBar,有的则被永久取消掉了。那个常标配于每个键盘的Esc键,眼看着却有淡出大众视野的趋势——…

matlab save将变量值保存为mat

将变量a的值保存到.mat文件中 save(object.mat,a)

开发人员的新分布式基元

面向对象的原语(进程中的原语) 作为Java开发人员,我非常熟悉面向对象的概念,例如类,对象,继承,封装,多态性等。除了面向对象的概念之外,我还非常熟悉Java运行时。它提供的…

LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)

LOJ洛谷 这题不就是Peaks(加强版)或者归程么。。这算是\(IOI2018\)撞上\(NOI2018\)的题了?\(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入这些点的边),我们可以得到两棵树(和那两题不一…

b站在线解析_这款游戏被全B站所唾弃,每个月却依然有5000万玩家坚持在线?!...

彩虹 | 视频安妮 | 编辑《迷你世界》,相信不少人都听过这个名字。这是个非常神奇的游戏,当然并不是指这个游戏很有自己的特色或者有趣的玩法。它神奇的地方在于你随便在bilibili挑一个有关《迷你世界》的视频打开,弹幕都是“呕”、“开炮”、…

linux 安装软件

安装软件 下载软件的源网址所放目录 vi /etc/apt/sources.list sudo apt-get update 更新源 sudo apt-get install xxx 安装软件,xxx为软件名 sudo apt-get build-dep xxx 安装相关的编译环境 sudo apt…

怎么创建数据表的实体类和业务类_怎样创建一个网站?

怎样创建一个网站?创建网站有三个特别重要的元素,域名、服务器和程序,网站域名按照流程注册就可以了,网站服务器根据网站需要的空间选择,这两个只要你查查或者问提供商就可以慢慢操作的,其中最难的程序&…

Neo4j:绘制“我的名字是……我在工作”图

在过去的几天里,我一直在关注DHH兴起的“我的名字是……”的推文。 据我了解,其想法是表明在白板上编写采访谜语/艰巨任务是荒谬的。 您好,我叫大卫。 我将无法在白板上写气泡排序。 我一直在互联网上查找代码。 我不做谜语。 — DHH&#…

LeetCode 705 Design HashSet 解题报告

题目要求 Design a HashSet without using any built-in hash table libraries. To be specific, your design should include these functions: add(value): Insert a value into the HashSet. contains(value) : Return whether the value exists in the HashSet or not.remo…

ubuntu vim命令

打开默认命令模式,按 i键,进入编辑(插入)模式;编辑完,按Esc键回到命令模式,:(冒号)进入末行模式 进入编辑模式,键I a o 显示行号 在末行模式下&…

mt4 指标 涨跌幅 颜色k线_Tick级别K线显示指标

tick是指价格的波动,价格每波动一次,tick数加1。这是一个生成新K线图的指标,做这个指标的原因是因为我听说某个机构就是用的这种图表交易的,我在网上找了一下,本来我是想找个现成的Tick图指标看看效果的,结…

java程序打包为jar_将Java应用程序打包为一个(或胖)JAR

java程序打包为jar这篇文章将针对一个有趣但非常强大的概念:将您的应用程序打包为单个可运行的JAR文件,也称为一个或胖 JAR。 我们习惯了大型WAR归档文件,其中包含所有打包在某些常见文件夹结构下的依赖项。 使用类似于JAR的打包&#xff0c…

类定义注意点

1、类成员函数访问修饰const,申明和定义中须保持一致; class IntCell{... ; int read( ) const;...} int IntCell::read( ) const { return storedValue } 转载于:https://www.cnblogs.com/wllwqdeai/p/10691130.html

xshell最多支持4个_中集拉钢卷专用挂车来了!自重5吨,最多能装4个钢卷

【卡车之家 原创】“拉钢卷”在卡车行业里并不是一个好词,和它关联的有送车拉钢卷、断梁、超载、事故等。在钢卷运输领域,超载现象严重,行业很少使用专用车辆运输,因此导致了各类事故频发,最严重的当属去年无锡大桥垮塌…

ubuntu chmod更改权限

权限 chmod 全称 change modifiy - rw- rw- rwx d rw- rw- r— - 第1位是‘-’是文件 第1位是‘d’是文件夹 拥有着权限 用户组权限 其他人权限 rwx 可读可写可执行 rw- 可读可写 r-x 可读不可写可执行 。。。 chmod urwx 1.txt 文件拥有者有rwx权…

优先级反转解决方案

1. 优先级反转(Priority Inversion) 由于多进程共享资源,具有最高优先权的进程被低优先级进程阻塞,反而使具有中优先级的进程先于高优先级的进程执行,导致系统的崩溃。这就是所谓的优先级反转(Priority Inversion)。 2. 产生原因 其…

如何在Java地毯下有效地清除问题

因为软件错误可能使我们在开发人员面前看起来很糟糕,并导致其他人对我们的想法减少,所以最好避免编写错误,快速识别和修复错误或掩盖我们的错误。 有许多博客文章和文章讨论如何避免错误以及如何识别和修复错误,因此,在…

python多线程_python多线程:控制线程数量

背景前段时间学习了python的多线程爬虫,当时爬取一个图片网站,开启多线程后,并没有限制线程的数量,也就是说,如果下载1000张图片,会一次性开启1000个子线程同时进行下载 现在希望控制线程数量&#xff…