设计模式之--原型模式
1.原型模式定义
原型模式非常简单,定义如下:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
2.通用类图
原型模式的核心是实现Cloneable接口,此接口为JDK提供的一个标识接口,只有实现了此接口的类才能被拷贝。
原型模式的通用类图如下;
3.通用原型实现代码
原型类:
public class ConcretePrototype implements Cloneable {private int id;private String name;public ConcretePrototype() {System.out.println("ConcretePrototype construct.");}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overrideprotected Object clone() throws CloneNotSupportedException {ConcretePrototype concretePrototype = null;try {concretePrototype = (ConcretePrototype) super.clone();} catch (Exception e) {}return concretePrototype;}@Overridepublic String toString() {return "ConcretePrototype{" +"id=" + id +", name='" + name + '\'' +'}';}
}
Client测试代码:
public class Client {public static void main(String[] args) throws Exception {ConcretePrototype concretePrototype = new ConcretePrototype();concretePrototype.setId(123);concretePrototype.setName("test");ConcretePrototype cloneType = (ConcretePrototype) concretePrototype.clone();cloneType.setId(111);cloneType.setName("test111");System.out.println(concretePrototype);System.out.println(cloneType);}
}
输出结果如下:
ConcretePrototype construct.
ConcretePrototype{id=123, name='test'}
ConcretePrototype{id=111, name='test111'}
通过输出结果可以看出,通过clone方法拷贝了一个新的对象。
4.原型模式的优点
1.性能优良
原型模式是在内存中二进制流的拷贝,要比直接new一个对象快的多
2.通过3中的输出结果来看,在clone对象的时候构造函数不会执行,这对于一些需要在构造函数中做一些初始化的类来说可能称为约束
5.需要注意的点
在原型模式拷贝的时候需要注意可变引用类型的属性,下面通过一个例子来说明此问题:
拷贝对象:
public class DeepClone implements Cloneable{private Map<String, Object> map = new HashMap<>();public void addPair(String key, String value){map.put(key, value);}public Map<String , Object> getMap(){return map;}@Overrideprotected Object clone() throws CloneNotSupportedException {DeepClone deepClone = null;try {deepClone = (DeepClone) super.clone();} catch (Exception e) {}return deepClone;}
}
Client类
public class Client {public static void main(String[] args) throws Exception {DeepClone deepClone = new DeepClone();deepClone.addPair("key1", "value1");DeepClone clone = (DeepClone) deepClone.clone();clone.addPair("key2", "value2");System.out.println(deepClone.getMap());}}
输出结果如下:
{key1=value1, key2=value2}
在使用clone方法拷贝对象的时候引用类型的属性不会继续做拷贝,而是多个拷贝对象使用同一个属性,这种被称为浅拷贝。
下面对clone方法重写完成深拷贝:
@Override
protected Object clone() throws CloneNotSupportedException {DeepClone deepClone = null;try {deepClone = (DeepClone) super.clone();Map<String, Object> cloneMap = new HashMap<>();cloneMap.putAll(this.map);deepClone.map = cloneMap;} catch (Exception e) {}return deepClone;
}
重新执行client输出结果为:
{key1=value1}
转载于:https://www.cnblogs.com/vitasyuan/p/9569404.html
设计模式之--原型模式相关推荐
- 【GOF23设计模式】原型模式
[GOF23设计模式]原型模式 来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_原型模式.prototype.浅复制.深复制.Cloneable接口 浅复制 1 pa ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
[索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...
- 教你如何一篇博客读懂设计模式之—--原型模式
教你如何一篇博客读懂设计模式之----原型模式 what:是什么 原型模式: 用于创建重复的对象,既不用一个属性一个属性去set和get,又不影响性能,原型模式产生的对象和原有的对象不是同一个实例,他 ...
- 二十三种设计模式之原型模式
今天继续探讨GOF二十三种设计模式的原型模式,原型模式也是属于创建型模式的一种 原型模式通俗的讲就是对象复制的过程,即通过一个原型对象,我可以得到一个该对象的克隆. 下面来看下原型模式的第一种写法-- ...
- C#设计模式(6)——原型模式(Prototype Pattern)
一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...
- 设计模式回顾——原型模式(C++)
文章目录 1 前言 2 什么是原型模式 2.1 原型模式组成 2.2 原型模式UML图 2.3 原型模式作用 3 原型模式优缺点 4 什么地方使用原型模式 5 原型模式实现 6 原型模式与构造函数 1 ...
- 设计模式之 原型模式
原型模式应用场景举例: GG和MM经常在QQ上聊天,但是GG打字的速度慢如蜗牛爬行,每次MM在瞬间完成恢复或者问候是,GG都会很紧张的去尽力快速打字,尽管如此,还是让MM有些不高心,MM说回复信息这 ...
- 设计模式之原型模式(Prototype)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...
- golang设计模式之原型模式
原型模式 wiki:原型模式是创建型模式的一种,其特点在于通过"复制"一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的"原型",这个 ...
- 【设计模式】原型模式 ( 概念简介 | 使用场景 | 优缺点 | 基本用法 )
文章目录 I . 原型模式 概念简介 II . 原型模式 使用场景 III . 原型模式 优缺点 IV . 原型模式 实现及 简单示例 I . 原型模式 概念简介 原型模式 : 用原型实例指定创建对象 ...
最新文章
- 第二课unit11 系统恢复技术
- 海外观察丨6 大营销风向洞察,暗藏哪些机会?
- ZHS16GBK的数据库导入到字符集为AL32UTF8的数据库
- 肯德基圣代中间空心_建造冰淇淋圣代解释CSS位置
- linux java文件 core_linux下部署.net core/java
- activity多实例任务减签
- 随想录(学习nxp rt1052 soc)
- GitCode 版本升级,让开发更加高效
- STM8S001J3M3还能完这么多花样,开发板尝鲜体验。
- 开好会议有诀窍------(转)
- 数据结构笔记(十)-- 循环队列
- 解决This application failed to start because cannot find or load the qt platform plugin 'xcb'
- ArcGIS应用视频教程(视频+PPT+实验数据)
- 广州大学人工智能原理实验二:八数码问题
- ArduPilot简介
- 彻底理解Runnable与Thread,真的有区别吗?
- 使用ping测试MTU值
- 风影ASP.NET基础教学 11 FormView
- 银行卡编码规则及检验算法详解
- Visual Studio 的问题:unable to locate visual studio installer
热门文章
- 宏基笔记本4740 Linux,宏基4740g拆机【教程详解】
- 常见的不同类型运算的转换方式
- 用jquery阻止事件起泡
- Microsoft SQL Server 2005 Service Pack 2 已经可以下载
- Go学习笔记—Channel通道
- 解决Spring下无法实时访问本地静态资源
- 链式栈的实现(头文件及源程序)
- python3 爬虫 requests安装_BOSS直聘招聘信息获取之爬虫工具分析
- c#小游戏_C#小游戏—钢铁侠VS太空侵略者
- python运行调出控制台_python.exe 和 pythonw.exe 的区别