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

设计模式之--原型模式相关推荐

  1. 【GOF23设计模式】原型模式

    [GOF23设计模式]原型模式 来源:http://www.bjsxt.com/  一.[GOF23设计模式]_原型模式.prototype.浅复制.深复制.Cloneable接口  浅复制 1 pa ...

  2. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

  3. 教你如何一篇博客读懂设计模式之—--原型模式

    教你如何一篇博客读懂设计模式之----原型模式 what:是什么 原型模式: 用于创建重复的对象,既不用一个属性一个属性去set和get,又不影响性能,原型模式产生的对象和原有的对象不是同一个实例,他 ...

  4. 二十三种设计模式之原型模式

    今天继续探讨GOF二十三种设计模式的原型模式,原型模式也是属于创建型模式的一种 原型模式通俗的讲就是对象复制的过程,即通过一个原型对象,我可以得到一个该对象的克隆. 下面来看下原型模式的第一种写法-- ...

  5. C#设计模式(6)——原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  6. 设计模式回顾——原型模式(C++)

    文章目录 1 前言 2 什么是原型模式 2.1 原型模式组成 2.2 原型模式UML图 2.3 原型模式作用 3 原型模式优缺点 4 什么地方使用原型模式 5 原型模式实现 6 原型模式与构造函数 1 ...

  7. 设计模式之 原型模式

    原型模式应用场景举例:  GG和MM经常在QQ上聊天,但是GG打字的速度慢如蜗牛爬行,每次MM在瞬间完成恢复或者问候是,GG都会很紧张的去尽力快速打字,尽管如此,还是让MM有些不高心,MM说回复信息这 ...

  8. 设计模式之原型模式(Prototype)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  9. golang设计模式之原型模式

    原型模式 wiki:原型模式是创建型模式的一种,其特点在于通过"复制"一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的"原型",这个 ...

  10. 【设计模式】原型模式 ( 概念简介 | 使用场景 | 优缺点 | 基本用法 )

    文章目录 I . 原型模式 概念简介 II . 原型模式 使用场景 III . 原型模式 优缺点 IV . 原型模式 实现及 简单示例 I . 原型模式 概念简介 原型模式 : 用原型实例指定创建对象 ...

最新文章

  1. 第二课unit11 系统恢复技术
  2. 海外观察丨6 大营销风向洞察,暗藏哪些机会?
  3. ZHS16GBK的数据库导入到字符集为AL32UTF8的数据库
  4. 肯德基圣代中间空心_建造冰淇淋圣代解释CSS位置
  5. linux java文件 core_linux下部署.net core/java
  6. activity多实例任务减签
  7. 随想录(学习nxp rt1052 soc)
  8. GitCode 版本升级,让开发更加高效
  9. STM8S001J3M3还能完这么多花样,开发板尝鲜体验。
  10. 开好会议有诀窍------(转)
  11. 数据结构笔记(十)-- 循环队列
  12. 解决This application failed to start because cannot find or load the qt platform plugin 'xcb'
  13. ArcGIS应用视频教程(视频+PPT+实验数据)
  14. 广州大学人工智能原理实验二:八数码问题
  15. ArduPilot简介
  16. 彻底理解Runnable与Thread,真的有区别吗?
  17. 使用ping测试MTU值
  18. 风影ASP.NET基础教学 11 FormView
  19. 银行卡编码规则及检验算法详解
  20. Visual Studio 的问题:unable to locate visual studio installer

热门文章

  1. 宏基笔记本4740 Linux,宏基4740g拆机【教程详解】
  2. 常见的不同类型运算的转换方式
  3. 用jquery阻止事件起泡
  4. Microsoft SQL Server 2005 Service Pack 2 已经可以下载
  5. Go学习笔记—Channel通道
  6. 解决Spring下无法实时访问本地静态资源
  7. 链式栈的实现(头文件及源程序)
  8. python3 爬虫 requests安装_BOSS直聘招聘信息获取之爬虫工具分析
  9. c#小游戏_C#小游戏—钢铁侠VS太空侵略者
  10. python运行调出控制台_python.exe 和 pythonw.exe 的区别