【设计模式】—-(5)原型模式(创建型)

设计模式——原型模式 使用Java实现原型模式,并且再次了解浅拷贝与深拷贝。 阅读详情

今天来看看23种设计模式中创建型的最后一种模式:原型模式。

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

类型:创建类模式

类图:

原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:

  • 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
  • 重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。

        原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。

实现代码:

[java]  view plain  copy
  1. class Prototype implements Cloneable {  
  2.     public Prototype clone(){  
  3.         Prototype prototype = null;  
  4.         try{  
  5.             prototype = (Prototype)super.clone();  
  6.         }catch(CloneNotSupportedException e){  
  7.             e.printStackTrace();  
  8.         }  
  9.         return prototype;   
  10.     }  
  11. }  
  12.   
  13. class ConcretePrototype extends Prototype{  
  14.     public void show(){  
  15.         System.out.println("原型模式实现类");  
  16.     }  
  17. }  
  18.   
  19. public class Client {  
  20.     public static void main(String[] args){  
  21.         ConcretePrototype cp = new ConcretePrototype();  
  22.         for(int i=0; i< 10; i++){  
  23.             ConcretePrototype clonecp = (ConcretePrototype)cp.clone();  
  24.             clonecp.show();  
  25.         }  
  26.     }  
  27. }  

原型模式的优点及适用场景

       使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。

       使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。

       因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。

原型模式的注意事项

  • 使用原型模式复制对象不会调用类的构造方法。因为对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不会调用到类的构造方法。不但构造方法中的代码不会执行,甚至连访问权限都对原型模式无效。还记得单例模式吗?单例模式中,只要将构造方法的访问权限设置为private型,就可以实现单例。但是clone方法直接无视构造方法的权限,所以,单例模式与原型模式是冲突的,在使用时要特别注意。
  • 深拷贝与浅拷贝。Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。例如:
[java]  view plain  copy
  1. public class Prototype implements Cloneable {  
  2.     private ArrayList list = new ArrayList();  
  3.     public Prototype clone(){  
  4.         Prototype prototype = null;  
  5.         try{  
  6.             prototype = (Prototype)super.clone();  
  7.             prototype.list = (ArrayList) this.list.clone();  
  8.         }catch(CloneNotSupportedException e){  
  9.             e.printStackTrace();  
  10.         }  
  11.         return prototype;   
  12.     }  
  13. }  

        由于ArrayList不是基本类型,所以成员变量list,不会被拷贝,需要我们自己实现深拷贝,幸运的是Java提供的大部分的容器类都实现了Cloneable接口。所以实现深拷贝并不是特别困难。

PS:深拷贝与浅拷贝问题中,会发生深拷贝的有java中的8中基本类型以及他们的封装类型,另外还有String类型。其余的都是浅拷贝。

关于深拷贝和浅拷贝:《JAVA中的深拷贝和浅拷贝》。


深度学习---双层神经网络中矩阵的运算及其含义记录 深度学习---双层神经网络中矩阵的运算及其含义记录神经网络的正向传播与反向传播正向传播第一层的权重矩阵第一层的输入矩阵Z^1^ = W^1^X^1^ + b^1^A^1^ = σ(Z^1^)第二层的权重矩阵第二层的输入矩阵Z^2^ = W^2^A^1^ + b^2^反向传播dz^2^ = A^2^ - Ydw^2^ = 1/n dz^2^A^1T^db^2^ = 1/n np.sum(dz^2... 阅读详情

相关推荐

从零到一:ASTER L2数据获取的实战避坑指南

本文提供了一份详细的ASTER L2数据获取实战指南,涵盖账号注册、环境配置、数据检索、下载故障排除及后处理等关键步骤。特别针对NASA EarthData平台的隐形门槛和常见陷阱,给出了实用解决方案,帮助科研新手高效获取地表温度数据,适用于环境监测和城市热岛效应分析等领域。

weixin_29061425的博客 519

设计模式之原型模式详解(附应用举例实现)

设计模式之原型模式详解(附应用举例实现)

pursuit的博客 8962

Cadence Allegro安装全攻略:从准备到优化的完整指南

本文提供了一份详尽的Cadence Allegro安装教程,涵盖从系统准备、硬件要求到获取安装文件的完整前期工作。指南逐步解析了自定义安装、路径选择及核心组件配置,并重点阐述了许可证服务器的环境变量设置与服务启动等关键激活步骤,最后给出了首次启动验证、个性化优化及常见问题排错方案,助您高效完成安装与配置。

weixin_29243063的博客 186

设计模式之原型模式

文章目录一、克隆羊问题1.1 传统方式解决克隆羊问题1.2 代码1.3 传统方式的缺点二、原型模式2.1 原型模式基本介绍2.2 原型模式原理结构uml类图2.3 原型模式解决克隆羊问题的应用实例2.4 原型模式在Spring框架中源码分析三、深入讨论-浅拷贝和深拷贝3.1 浅拷贝介绍3.2 深拷贝基本介绍3.3 深拷贝应用实例四、原型模式的注意事项和细节 一、克隆羊问题 现在有一只羊 tom,姓...

yihaoa的博客 713

各种加法器的比对分析与Verilog实现(3)

了Kogge-Stone加法器和brent-kung加法器,本文将用Verilog代码进行实现。

Albert_yeager的博客 1198

用 Custom Entity 打造 RAP Value Help:从能跑到好用的深度踩坑笔记

本文介绍了在RAP项目中实现Value Help(Fiori输入帮助)的完整流程。通过Custom Entity方式,开发者可以灵活构建不依赖数据库实体的值帮助功能,但需手动实现CDS原本提供的过滤、排序、分页等能力。文章以一个典型场景为例,详细说明了如何为Partner维护界面的City字段创建可搜索的值帮助,包括创建查询实现类、绑定CDS Custom Entity、服务发布等关键步骤,并特别指出了处理排序分页请求等常见问题。最后强调在ABAP Cloud环境下需要自行实现查询能力,而非依赖传统工具类。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 140

设计模式—原型模式(Prototype)

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节简单说就是先创建一个原型类实例,然后通过克隆的方法来复制一个一样的新对象,这个对象和原来的对象相同或相似核心:通过自带的Clone()方法和ICloneable接口创建跟该对象相同的新对象,不需要知道具体的创建细节。就是具有相同的属性和功能的对象的抽象的集合。类名称首字母大写。多个单词则各个首字母大写;对外公开的方法需要用‘public’修饰符。

一起加油吧~ 4507

CloudCompare 二次开发(6)——插件中拖拽添加Qt窗口(区域生长算法为例)

手动拖拽的方式搭建Qt对话框界面的制作流程,以PCL中的点云区域生长算法为例进行制作。

点云侠的博客 2153

设计模式第8讲——原型模式(Prototype)

原型模式属于创建型设计模式。 一、什么是原型模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现5.0 UML类图5.1 HeroSkill(英雄--具体原型类)5.2 StealManFactory(塞拉斯--客户端)5.3 TestPrototype六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 4941

【雷达】一维和二维自适应波束形成(DBF))DBF附matlab代码

1 简介 数字波束形成技术是天线波束形成原理与数字信号处理技术相结合的产物,其广泛应用于阵列信号处理领域.由于电磁工作环境的恶化和大量射频干扰的存在,在极低的信干噪比(SINR)条件下进行目标检测和信息提取十分困难.对于阵列系统,往往采用自适应数字波束形成(ADBF)技术,来抑制强干扰和方向性干扰对有用信号的影响.介绍了数字波束形成器的基本原理及其DSP的实现结构.​ 2 完整代码 clc;clear all;close all;%%%%%%%%%%%%%%%%%一维DBF%%%%%%%%%%%%%

qq_59747472的博客 7267

SPI协议详解(图文并茂+超详细)

先说串口 因为之前写过一篇UART,通用串行异步通讯协议,UART的相关资料 因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。 如果要解决这个问题,UART为每个字节添加额外的起始位和停止位,以帮助接收器在数据到达时进行同步; 双方还必须事先就传输速度达成共识(设置相同的波特率,例如每秒9600位)。 传输速率如果有微小差异不是问题,因为接收器会在每个字节的开头重新同步。相应的协议如下图所示; 如果您注意到

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 33万+

23种设计模式(5)_创建型_原型模式(Prototype Pattern)

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。 因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,

heyuchang666的专栏 749

提交 ieee 手稿出现:Do not include the Reviewer PDF with my submission 怎么办

IEEE投稿Reviewer PDF选项说明 投稿时出现的"Do not include the Reviewer PDF with my submission"选项控制是否附带评审专用PDF文件。Reviewer PDF是系统自动生成包含所有投稿材料的完整PDF,用于同行评审。建议保持默认不勾选状态,除非确认编辑部不需要该文件,否则可能影响审稿流程。勾选表示不附带此PDF,不勾选则会正常生成并提交该评审文件。

ZhangJiqun&191cm&85kg 2205

C++设计模式|创建型 5.原型模式

原型模式⼀种创建型设计模式,该模式的核⼼思想是基于现有的对象创建新的对象,⽽不是从头开始创建。在原型模式中,通常有⼀个原型对象,它被⽤作创建新对象的模板。新对象通过复制原型对象的属性和状态来创 建,⽽⽆需知道具体的创建细节。2.为什么要使用原型模式?如果一个对象的创建过程比较复杂时(比如需要经过一系列的计算和资源消耗),那每次创建该对象都需要消耗资源,而通过原型模式就可以复制现有的一个对象来迅速创建/克隆一个新对象,不必关心具体的创建细节,可以降低对象创建的成本。

Brillian123的博客 602

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

5/23 创建型设计模式: 原型模式

原型模式 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。 JAVA与CSharp JAVA与C#原本就支持原型模式,因为每一个Class都集成Obje

XiaoCai 1702

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

设计模式: 创建型之原型模式(5)

这个模式十分有用,尤其是创建对象的流程赋值的时候(比如造鞋的流程),如依赖于很多设置文件(鞋子依赖哪些原材料, 不同的环境配置)等。工厂模式定义一个用于创建对象的接口,这个接口由子类(可以理解为产品线)决定实例化哪一个类(生产衣服还是鞋子)该模式使一个类的实例化延迟到了子类,也就是很多产品线在工厂里,当用的时候才告诉产品线干活。而子类可以重写接口方法(比如修改造鞋流程)以便创建的时候指定自己的对象类型(抽象工厂)并且,你会经常在程序里看到工厂方法,用于让子类定义需要创建的对象类型,也就是生产单例。

Wang的专栏 474

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

5种创建型设计模式-原型模式(PrototypePattern)

原型模式(Prototype)用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 Prototype Pattern也是一种创建型模式,它关注的是大量相同或相似对象的创建问题。应用原型模式就是建立一个原型,然后通过对原型来进行复制的方法,来产生一个和原型相同或相似的新对象,或者说用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。 public abstract cla...

u012075901的博客 381

【C#设计模式】5.原型模式(Prototype)【创建型】

1.1 动机(Motivate) 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变? 1.2 意图(Intent) 使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。 --《设计模式》Gof ..................

星Yeah 的博客 3228

设计模式-创建型(5种)-原型模式

原型模式提供了简化的创建结构,工厂方法模式常常需要有一个与产品类等级结构相同的工厂等级结构(具体工厂对应具体产品),而原型模式就不需要这样,原型模式的产品复制是通过封装在原型类中的克隆方法实现的,无须专门的工厂类来创建产品.除去那些引用其他对象的变量,被复制对象的所有变量都含有与原来的对象相同的值。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象(克隆对象与原型对象共享引用数据类型变量)

益章的博客 562

【设计模式】【创建型5-5】【原型模式】

用途,以原型为模板,源源不断的创建(克隆 clone)对象。当直接创建对象的代价比较大时,则采用这种模式。代码使用:spring框架里 bean的作用域。

SHI_IHS的博客 452

Java设计模式(5)创建型:原型模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/zeping891103/article/details/53765536 (一)模式概念 原型模式是指用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。P...

chongfeng2994的博客 83

[设计模式-创建型模式5种-05原型模式]

[设计模式-创建型模式5种-05原型模式]

m0_61164038的博客 140

5.Java设计模式-创建型模式-原型模式

原型模式

G_change_的博客 193

【设计模式深度剖析】【5】【创建型】【原型模式】| 类比群发邮件,加深理解

设计模式-创建型-原型模式

浣花御劍 1320

设计模式5——原型模式(创建型模式)

原型模式,根据现有的实例变量( A ),复制(克隆)出相同类型的实例变量 ( B )。 要理解原型模式的实质,核心的要点是搞清楚 “ 深复制 ” 和 “ 浅复制 ”。 一,“ 深复制 ” 和 “ 浅复制 ” 的概念和区别 浅复制:使用一个已知实例 ( A ) 对新创建实例 ( B ) 的成员变量逐个赋值,这个方式也被称为浅拷贝 深复制:不仅要复制对象的所有非引用类型成员(即基本数据类型变量...

ding3106的专栏 265

设计模式之创建型模式—— 1.5 原型模式

<?php /** *1.5原型模式 * 解决的问题: * 某些结构复杂的对象的创建工作,由于需 * 求的变化,这些对象经常面临着剧烈的变 * 化,但是它们却有用比较稳定一种的接口。 *解决的方案: * 用原型实例指定创建对象的种类,并且通 * 过拷贝这些原型创建新的对象。 *该模式无需任何角色:...

weixin_34262482的博客 83
上一篇: 【设计模式】—-(4)建造者模式(创建型)
下一篇: 【设计模式小结】—-创建型模式
白衣染霜陈
博客等级 码龄22年 682粉丝 338原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值