java原始模型模式_java设计模式--原始模型模式

简介

原始模型模式属于对象的创建模式。通过一个原型对象来指明要创建对象的类型,然后用复制原型对象的方法来创建出更多同类型的对象。

Java所有的类都是从java.lang.Object类继承来的,Object类提供clone()方法对对象进行复制。一般调用clone()方法需要满足一下条件:

1、对于任何对象x,都有:x.clone()!=x。也就是克隆的对象和原对象不是一个对象。

2、对于任何对象x,都有:x.clone().getClass()=x.getClass()。也就是克隆对象与原对象是相同的类型。

3、如果对象x的equal()方法定义恰当的话,那么x.clone().equal(x)应该成立。

原始模型模式

原始模型模式分为两种类型:1、简单形式;2、登记形式。下面分别解释下这两种类型。

简单形式的原始模型模式类图:

c7c6c8a24e4092e7c35d6e581a7033cc.png

这种模式的三个角色:

1、客户角色:客户提出创建对象的请求。

2、抽象原型:抽象角色,给出具体原型所需的接口。

3、具体原型:被复制的对象,需实现抽象原型所需要的接口。

抽象原型代码:

public interface Prototype extendsCloneable{ public Object clone() throwsCloneNotSupportedException; }

具体原型代码:

public class ConcrecePrototype implementsPrototype{ public Object clone() throwsCloneNotSupportedException { try{ return super.clone(); } catch(Exception e) { return null; } } }

客户角色代码:

public classClient { privatePrototype prototype; public void operation(Prototype example) throwsCloneNotSupportedException{ Prototype p =(Prototype) example.clone(); } }

登记形式的原始模型模型类图:

e524929f13688224e6bdfd29bf62add9.png

这种模式的角色:

1、客户角色:客户提出创建对象的请求。

2、抽象原型:抽象角色,给出具体原型所需的接口。

3、具体原型:被复制的对象,需实现抽象原型所需要的接口。

4、原型管理器:创建具体原型类对象,并记录每一个被创建的对象。

抽象原型代码:

public interface Prototype extendsCloneable{ public Object clone() throwsCloneNotSupportedException; }

具体原型代码:

public class ConcrecePrototype implementsPrototype{ public synchronized Object clone() throwsCloneNotSupportedException { Prototype temp = null; try{ temp = (Prototype) super.clone(); } catch(Exception e) { System.out.println("clone fail"); }finally{ returntemp; } } }

原型管理器代码:

public classPrototypeManager { private Vector vector = newVector();

public voidadd(Prototype e){ vector.add(e); }

public Prototype get(inti){ return(Prototype) vector.get(i); } }

客户端代码:

public classClient { privatePrototypeManager pm; privatePrototype p;

public void registerPrototype(Prototype prototype) throwsCloneNotSupportedException{ Prototype temp =(Prototype) prototype.clone(); pm.add(temp); } }

可以看出,如果要创建的原型对象少且固定的话可以考虑使用简单形式的原型模式。如果要创建的原型对象不固定,可以使用登记形式的原型模式。原型对象有原型管理器保管,如果其中有则直接拿出,没有则复制并加入其中。

引深

看到这里就会想到了java中重要的话题:浅复制和深复制。

浅复制:被复制对象的所有变量都与原来对象有相同的值,而所有对其对象的引用都指向原对象。浅复制只考虑复制所考虑的对象,而不复制它所引用的对象。

深复制:被复制对象的所有变量都与原来对象有相同的值,那些引用其他对象的变量指向被复制的新对象。深复制中那些引用其他对象的变量将指向被复制过的新对象,也就是深复制把要复制的对象所引用的对象都复制了一遍。

原始模型模式的优缺点

优点:

1、  原始模型模型模式允许动态地增加或减少产品类。由于创建产品类实例的方法是产品类内部具有的,因此,增加新产品的对整个结构没有影响。

2、  原始模型模式提供简化的创建结构。工厂方法模式常常需要有一个与产品类等级相同的结构,而原始模型模式就不需要这样。

3、  具有给一个应用软件动态加载新功能的能力。

4、  产品类不需要非得有任何事先确定的等级结构,因为原始模型模式适用于任何的等级。

缺点:

原始模型模式最主要的缺点就是需要为每一个类都必须具备一个复制方法。

另外,如果在原型对象中有间接对象,可以将间接对象设置为transient不予以复制,或者自行创建出相当的同种对象。

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

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

相关文章

Windows的命令行窗口运行Python时,如何清屏?

问题 如标题 解法 import os os.system("cls")参考 python实现清屏

手写文字识别java_java 手写文字图片识别提取 百度API

package org.fh.util;import org.json.JSONObject;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.util.List;import java.util.Map;/*** 说明:获取文字识别token类* from&am…

LeetCode - Easy - 191. Number of 1 Bits

Topic Bit Manipulation Description https://leetcode.com/problems/number-of-1-bits/ Write a function that takes an unsigned integer and returns the number of ‘1’ bits it has (also known as the Hamming weight). Note: Note that in some languages such …

java并行计算同步返回_Java大文本并行计算实现过程解析

Java大文本并行计算实现过程解析简单提高文本读取效率,使用BufferedReader是个不错的选择。速度最快的方法是MappedByteBuffer,但是,相比BufferedReader而言,效果不是非常明显。也就是说,后者虽然快,但也快…

wgs utm java,Java,将经纬度转换为UTM

Does anyone know of a way, in Java, to convert an earth surface position from lat, lon to UTM (say in WGS84)? Im currently looking at Geotools but unfortunately the solution is not obvious.解决方案I was able to use Geotools 2.4 to get something that works…

java 指定时间转换_Java中使用Calendar进行获取指定时间,使用SimpleDateFormat进行格式化转换...

java中使用Calendar获取指定的时间public class DateTranslate {/*** 获取指定日期的间隔月份的第一天的日期* param date* param sep* return*/public static Date getMonthFirstDay(Date date, Integer sep) {Calendar cal Calendar.getInstance();cal.setTime(getThisWeekM…

java mvc 菜鸟_【java框架】SpringMVC(1)--SpringMVC入门

1.SpringMVC框架认识Spring MVC是一个基于MVC模式的Web框架,SpringMVC作为Spring中的一个模块,它与Spring能够无缝集成,主要用于解决企业Web开发中常见的问题:如参数接收、文件上传、表单验证、国际化等等。2.SpringMVC HelloWorl…

php设置cookie 域名,php如何设置cookie对整个域名有效?

php设置cookie对整个域名有效的方法:由setcookie函数让cookie对整个域名有效,代码为【setcookie("cookie_test", this is cookie test, time()3600,"/",“】。php设置cookie对整个域名有效的方法:默认情况下的cookie仅对…

php 配置 gd2,配置PHP对gd库的支持

搭建zabbix的时候遇到有对PHP的需求检测,发现没有对gd的支持,记录下。。。GD库是php处理图形的扩展库,它提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片,也可以给图片加水印。1、安装zl…

我的世界一个程序导致JAVA,Java地位无可动摇的12个原因

如今,面对曾经在程序员中被各种新技术掩盖直至堙灭的技术值得怀念。犹如COBOL这当年被老程序员们尊为神器的语言如今也基本没有价值。而Java作为现代程序员的中坚力量在这点上或许会成为下一个COBOL。有关JAVA的技术卖出多少本书已经是一个很久远的记忆了。现处中年…

php 自定义格式化,PHP自定义函数格式化json数据示例

本文实例讲述了PHP自定义函数格式化json数据的方法。分享给大家供大家参考,具体如下:/*** Formats a JSON string for pretty printing** param string $json The JSON to make pretty* param bool $html Insert nonbreaking spaces and s for tabs and …

php 单选框选中事件,html中的checkbox和radio事件选择用法详解

radio注册了click事件以后,神奇的是用键盘上的上下左右选择时,居然会触发鼠标事件,滚轮也会触发,这种神奇的事情在mousedown下面是不会发生的。(webkit不能使用上下左右选择)checkbox注册click事件后,奇迹再次上演&…

java水文模型,分布式水文模型.ppt

分布式水文模型ppt课件第九章分布式水文模拟技术 第九章 分布式水文模拟技术 9.1 分布式水文模型的发展 9.1.1 分布式水文模型的研究进展 9.1.1.2 几点讨论 9.1.2 分布式水文模型的发展 9.2 基于DEM的流域分布式水文模型 9.2.1 流域水文过程及其数学模拟 流域水循环过程示意图 …

php 实现的n,php 实现数据N等分。

本例给出实现3等分的代码和运行结果。在保证&#xff0c;每一个部分都不会宕机的情况下&#xff0c;这种算法是最简单的。否则就用一致性哈希算法。公式原理&#xff1a;求余算法: hash(object)%Nfor($i 1;$i<100;$i){$result crc32($i) % 3;echo "i:".$i . &qu…

ccf json解析 java,【求助】e4a json解析 求助大佬帮忙老看下怎么取?

[PHP] 纯文本查看 复制代码[{"title":"\u4e1c\u98ce\u7834","url":"\/tv\/QrRobH7kTGTqNX.html","star":"\u4e3b\u6f14\uff1a\u5f20\u7b11\u541b \u5f20\u94ce \u725b\u4e3d\u71d5 \u5218\u5c0f\u950b \u68a6\u6960&qu…

java 场景处理,将黄瓜场景示例作为一个场景处理

我遇到了Cucumber的问题 - 现在我正在进行移动自动化&#xff0c;并且我有使用场景轮廓的功能 - 我在场景中有一些变量&#xff1a;场景大纲&#xff1a;菜单项Given the user is on the hamburger menuAnd the language is Then menu item is Examples:| menu item | language…

mysql 5.5.23 winx64,win10下mysql 5.7.23 winx64安装配置方法图文教程

本文记录了mysql 5.7.23 winx64安装教程&#xff0c;具体内容如下Step1选择手动下载版本解压到自己指定的路径上图中的my.ini及data文件夹在压缩包里是没有的&#xff0c;后面需要自己添加my.ini如下&#xff0c;直接copy~然后在目录下创建一个data文件夹Step2设置环境变量电脑…

php if !=,php If else 用法

PHP的&#xff0c;如果声明是非常类似于其他编程语言使用if语句&#xff0c;但对于那些谁不熟悉它&#xff0c;图片如下&#xff1a;想想你的决定作出之前&#xff0c;你去睡觉。如果你有这样做的第二天&#xff0c;说去上班&#xff0c;上学&#xff0c;或任用&#xff0c;那么…

matlab生成均匀部分散点图,应用halton序列生成均匀散点图

前言一门课的作业要用RBF-DQ方法计算流场。简单来讲就是要在无网格的条件下用高精度格式实现流场的仿真计算。生成散点图时&#xff0c;用蒙特卡洛的方法得到的散点图分布不是很均匀&#xff0c;于是想到一种叫做halton的序列。本篇将运用halton序列生成均匀的散点图。halton序…

php分页页数过多隐藏,织梦DEDE中内容页分页数目太多时隐藏方法

在dede程序的文章或图集模型&#xff0c;内容页分页过多&#xff0c;假如分页80页&#xff0c;那么dede默认的内容分页标签{dede:pagebreak/}会把所有的分页都显示出来&#xff0c;这样会撑破网页模板&#xff0c;即使使用css控制可以解决这个撑破模板问题&#xff0c;用overfl…