java设计模式face_java设计模式之-------原型模式

一、模式定义

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

二、模式场景假设

此处结合23中设计模式记忆篇作出假设,不关心逻辑是否合理。柳岩在跳舞的时候烧伤了脸,再也回不到原来的型状。他就克隆一张脸。类图如下:

fec2635ac33e2816704af955e054bb92.png

三、代码实现

1、创建一个类柳岩的脸

package com.pattern.prototype;

/**

* 建立一个类,代表柳岩的脸

* @author dgw

*

*/

public class LiuYanFace implements Cloneable{

//脸的颜色

private String color;

public LiuYanFace(){

//System.out.println("柳岩的脸");

}

public LiuYanFace(String color) {

super();

this.color = color;

}

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

//重新Object中的clone方法

@Override

protected LiuYanFace clone() throws CloneNotSupportedException {

return (LiuYanFace) super.clone();

}

}

2,测试代码

package com.pattern.prototype;

import org.junit.Test;

public class TestProtoType {

@Test

public void testPrototype() throws CloneNotSupportedException{

//创建100万对象需要 8.524s

//int i=0;

//while(i<1000000){

//LiuYanFace liuYanFace = new LiuYanFace();

//i++;

//}

//创建100万对象需要 8.220s

//int i=0;

//LiuYanFace liuYanFace = new LiuYanFace();

//while(i<1000000){

//LiuYanFace clone = liuYanFace.clone();

//i++;

//}

}

}

3、原型模式的注意事项

1)潜克隆对应用对象不进行拷贝。

package com.pattern.prototype;

import java.util.Map;

import org.junit.Test;

public class TestProtoType {

@Test

public void testPrototype() throws CloneNotSupportedException{

//创建100万对象需要 8.524s

//int i=0;

//while(i<1000000){

//LiuYanFace liuYanFace = new LiuYanFace();

//i++;

//}

//创建100万对象需要 8.220s

//int i=0;

//LiuYanFace liuYanFace = new LiuYanFace();

//while(i<1000000){

//LiuYanFace clone = liuYanFace.clone();

//i++;

//}

//原型对象

LiuYanFace liuYanFace = new LiuYanFace("白的");

//克隆对象

LiuYanFace clone = liuYanFace.clone();

clone.setColor("黑的");

//原型对象的颜色

System.out.println(liuYanFace.getColor());//白的

//克隆对象的颜色

System.out.println(clone.getColor());//黑的

//克隆对象的颜色

System.out.println(liuYanFace.map);

//{prototype=白的}

System.out.println(clone.map);

//{prototype=白的}

//修改克隆对象的map中颜色

clone.map.put("prototype", "黄的");

//见鬼了吗,怎么都改为黄色了,哈哈,这就是潜克隆。java偷懒了只克隆本对象,其对象内的数组、引用对象(String除外)都不拷贝。

System.out.println(liuYanFace.map);//黄的

System.out.println(clone.map);//黄的

}

}

2)深克隆,深拷贝。

package com.pattern.prototype;

import java.util.HashMap;

import java.util.Map;

import java.util.UUID;

/**

* 建立一个类,代表柳岩的脸

* @author dgw

*

*/

public class LiuYanFace implements Cloneable{

public Map map=new HashMap();

//脸的颜色

private String color;

public LiuYanFace(){

//System.out.println("柳岩的脸");

}

public LiuYanFace(String color) {

super();

this.color = color;

map.put("prototype", color);

}

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

//重新Object中的clone方法

@SuppressWarnings("unchecked")

@Override

protected LiuYanFace clone(){

LiuYanFace face=null;

try {

face=(LiuYanFace) super.clone();

//深度克隆

//face.map=(Map) ((HashMap) this.map).clone();

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

return face;

}

}

package com.pattern.prototype;

import java.util.Map;

import org.junit.Test;

public class TestProtoType {

@Test

public void testPrototype() throws CloneNotSupportedException{

//创建100万对象需要 8.524s

//int i=0;

//while(i<1000000){

//LiuYanFace liuYanFace = new LiuYanFace();

//i++;

//}

//创建100万对象需要 8.220s

//int i=0;

//LiuYanFace liuYanFace = new LiuYanFace();

//while(i<1000000){

//LiuYanFace clone = liuYanFace.clone();

//i++;

//}

//原型对象

LiuYanFace liuYanFace = new LiuYanFace("白的");

//克隆对象

LiuYanFace clone = liuYanFace.clone();

clone.setColor("黑的");

//原型对象的颜色

System.out.println(liuYanFace.getColor());//白的

//克隆对象的颜色

System.out.println(clone.getColor());//黑的

//克隆对象的颜色

System.out.println(liuYanFace.map);

//{prototype=白的}

System.out.println(clone.map);

//{prototype=白的}

//修改克隆对象的map中颜色

clone.map.put("prototype", "黄的");

System.out.println(liuYanFace.map);//白的

System.out.println(clone.map);//黄的

}

}

3)需要考培的属性不能使用final修饰。

四、优缺点分析

优点:性能良好、在内存中二进制流的拷贝,比new性能好。

缺点:在拷贝是构造函数不会执行,减少了约束。

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

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

相关文章

你被这些网络迷题难倒过吗?

全世界有3.14 % 的人已经关注了数据与算法之美消失的正方形这是数学游戏大师马丁加德纳在《从惊讶到思考》一书中提到过的例子。重新摆放分割的小块图形后&#xff0c;上面的正方形中少了一个小方格&#xff0c;它去了哪里&#xff1f;我们不妨实际操作一下&#xff0c;做两个全…

温故知新,.Net Core遇见Blazor(FluentUI),属于未来的SPA框架

什么是BlazorBlazor是一个使用.NET生成交互式客户端WebUI的框架:使用C#代替JavaScript来创建信息丰富的交互式UI。共享使用.NET编写的服务器端和客户端应用逻辑。将UI呈现为HTML和CSS&#xff0c;以支持众多浏览器&#xff0c;其中包括移动浏览器。与新式托管平台&#xff08;如…

看来要先拒绝37%的女人,才能找到真爱

全世界有3.14 % 的人已经关注了数据与算法之美在每期《非诚勿扰》节目上&#xff0c;面对一位位男嘉宾&#xff0c;24位单身女生要做出不止一次“艰难的决定”&#xff1a;到底要不要继续亮灯&#xff1f;把灯灭掉意味着放弃了这一次机会&#xff0c;继续亮灯则有可能结束节目之…

.Net日志之nlog

1. 介绍NLog是适用于各种.NET平台&#xff08;包括.NET标准&#xff09;的灵活&#xff0c;免费的日志记录平台&#xff0c;支持数据库、文件、控制台。2. 输入到文件2.1 引用nuget包<PackageReference Include"NLog" Version"4.7.6" /><PackageR…

为了证明自己有多能喝,理工科的学生竟做出这种事

全世界有3.14 % 的人已经关注了数据与算法之美当酒鬼止不住地说“我没有醉”、“再来一杯”的时候&#xff0c;他基本上已经醉得不行了。此时&#xff0c;他会说出一堆毫无逻辑的话&#xff0c;让旁人听了不知所云。这就是最为常见的酒鬼形象了。直到某一天&#xff0c;死理性派…

65 + iPhone应用程序网站创意设计灵感(上篇)

这里是一个巨大的艺术创作的iPhone APP网站设计的灵感收集。这些网站设计&#xff0c;特殊的配色方案&#xff0c;详细的图标和高品质的图形使用&#xff0c;如此精彩。希望能给你带来灵感。 Analog App Courier App Thermo App Faces Ecoki Motionoto Barista Moneybook App L…

php程序员跟java一样吗,【后端开辟】php程序员能够转java吗?

php顺序员可以转java吗&#xff1f;可以。关于专业顺序员来讲&#xff0c;在差别的开辟场景下采纳差别的编程言语是比较罕见的事变&#xff0c;所以许多顺序员在事情一段时候以后都邑控制多种差别的编程言语&#xff0c;比方不少Web顺序员都邑同时控制Java、PHP、C#等编程言语。…

你管这叫线程安全?

来来来&#xff0c;面试八股文&#xff1f;今天我们从什么叫"线程安全"聊起&#xff1f;文末"边吃边聊"。今日份的干粮&#xff1a;1.什么叫线程安全&#xff1f;2.线程安全与变量的关系&#xff1f;•变量又与堆/栈/静态存储区有密切关系什么叫线程安全&a…

经济学家告诉你,胸越大的女生越会花钱!

全世界有3.14 % 的人已经关注了数据与算法之美大概两周前回加拿大的航班上&#xff0c;我在机舱尾部跟一位空姐聊了很久。当空姐小妹双眼向下一瞥&#xff0c;略微停顿之后问我“班组要在这里呆四天&#xff0c;不知道该干什么去”的时候&#xff0c;我认认真真的为自己叹了口气…

讲100个科学道理,不如做这些有趣的理科实验!

玩具和学习看似是两个对立的东西&#xff0c;孩子天性爱玩&#xff0c;家长却希望孩子能多学习。不一定非要啃课本才能汲取知识&#xff0c;有时候&#xff0c;在轻松有趣的游戏中也能学到课堂上学不到的知识。让学习变得有趣、高效——给孩子讲100个科学道理&#xff0c;不如带…

《权力》读书笔记

1 为什么权力只为某些人所拥有我们生活在一个充满等级制度的世界里&#xff0c;等级的存在就意味着竞争&#xff0c;而且越往上&#xff0c;职位就越少&#xff0c;竞争也就越激烈。只有了解权力的原则&#xff0c;并愿意运用它们的人&#xff0c;才可以参与这样的竞争&#xf…

嘘!偷偷教你们一个在双十一省钱的办法!

各位小可爱&#xff0c;大可爱&#xff0c;大家晚上好~一年一度的双11即将到来&#xff01;&#xff01;&#xff01;小木冒着被砍头的风险为大家争取了好多好多福利绝对比平时更优惠更省钱哦&#xff01;&#xff01;&#xff01;活动时间&#xff1a;10月27日-11月11日&#…

ML.NET 示例:图像分类模型训练-首选API(基于原生TensorFlow迁移学习)

ML.NET 版本API 类型状态应用程序类型数据类型场景机器学习任务算法Microsoft.ML 1.5.0动态API最新控制台应用程序和Web应用程序图片文件图像分类基于迁移学习的TensorFlow模型再训练进行图像分类DNN架构&#xff1a;ResNet、InceptionV3、MobileNet等问题图像分类是深度学习学…

算法证明:女生遇到心动的男人一定要追!

全世界有3.14 % 的人已经关注了数据与算法之美我来讲恋爱中的博弈&#xff0c;不&#xff0c;我来讲恋爱中的算法&#xff0c;不&#xff0c;我来讲算法&#xff01;&#xff01;有个著名的问题&#xff0c;叫做 stable matching。早年是一个可爱的俄罗斯老头在图论课上教我的&…

记一次 .NET 某教育系统 异常崩溃分析

一&#xff1a;背景 1. 讲故事这篇文章起源于 搬砖队大佬 的精彩文章 WinDBg定位asp.net mvc项目异常崩溃源码位置 &#xff0c;写的非常好&#xff0c;不过美中不足的是通览全文之后&#xff0c;总觉得有那么一点不过瘾&#xff0c;就是没有把当时抛异常前的参数给找出来。。。…

Json.Net系列教程 3.Json.Net序列化和反序列化设置

上节补充首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一个DataTable对象,如下: DataTable dt new DataTable();DataColumn dcName new DataColumn("Name");DataColu…

5道谷歌面试题:即使是天才也要怀疑自己能力了(附答案)

全世界只有3.14 % 的人关注了数据与算法之美谷歌&#xff0c;美国的跨国科技企业&#xff0c;致力于互联网搜索、云计算、广告技术等领域&#xff0c;开发并提供大量基于互联网的产品与服务。这样一家实力雄厚前景无量的公司是众多求职者梦寐以求的地方&#xff0c;然而&#x…

[Abp vNext 源码分析] - 18. 单元测试

简介ABP vNext 框架使用 xUnit 作为单元测试组件&#xff0c;官方的所有模块都编写了大量的 单元/集成测试 确保功能正常。由于 ABP vNext 模块化系统的原因&#xff0c;开发人员在建立单元测试项目的时候需要集成 Volo.Abp.UnitTest 项目&#xff0c;这样在执行单元测试的时候…

php表格单元格怎么实现排序,javascript实现对表格元素进行排序操作

我们在上网中都能看到很多能够排序的&#xff0c;如大小、时间、价格等现在我们也试一下排序功能&#xff1a;排序的函数代码&#xff1a;里面含有点击之后排序--还原&#xff0c;和排升序和降序。function sortAge(){//对年龄进行排序&#xff0c;要先进行获得每一行对象&…

【10.29周一电商,已好】中国日历的至高境界,377张震撼级插画,美到爆!

每段时光都有属于每段时光的回忆它们是童年的纸飞机是校园时代的试卷与课本是第一次离开家乡时的兴奋与忐忑是跟某个人眼神交汇时的慌乱...回忆如此珍贵&#xff0c;以致于令我们频频回想&#xff0c;渴望着回到过去&#xff0c;与美好再度相逢。还记得文先生给大家推荐过的新一…