秒懂设计模式——原型模式


(五)原型模式

【官方定义】用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象,属于对象创建模式。

【举例】在找工作的时候,通常需要我们的毕业证和学位证,但是我们一般不会把原件(原型实例)给到用人单位,而是会把原件复印(拷贝)几份,然后供用人单位使用。

【Java代码】

①创建一个证书抽象类。

package com.liyan.prototype;
/*** 证书抽象类* <p>Title: Certificate</p>  * @author  Liyan  * @date    2017年5月2日 下午3:17:37*/
public abstract class Certificate implements Cloneable{/**证书编号*/private Integer id;/**证书名称*/protected String name;/**测试方法*/abstract void testMethod();public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}@Overridepublic String toString() {return "Certificate [id=" + id + ", name=" + name + "]";}}

②创建证书扩展类——毕业证

package com.liyan.prototype;
/*** 数据信息扩展类——毕业证* <p>Title: GraduationCertificate</p>  * @author  Liyan  * @date    2017年5月2日 下午3:17:47*/
public class GraduationCertificate extends Certificate{public GraduationCertificate() {name = "毕业证";}@Overridevoid testMethod() {System.out.println("毕业证复印完成!");}}

③创建证书扩展类——学位证

package com.liyan.prototype;
/*** 证书扩展类——学位证* <p>Title: DegreeCertificate</p>  * @author  Liyan  * @date    2017年5月2日 下午3:18:26*/
public class DegreeCertificate extends Certificate{public DegreeCertificate() {name = "学位证";}@Overridevoid testMethod() {System.out.println("学位证复印完成!");}}

④创建原型模式管理器——证书管理器

package com.liyan.prototype;
import java.util.HashMap;/*** 原型模式管理器——证书管理器* <p>Title: CertificateManger</p>  * @author  Liyan  * @date    2017年5月2日 下午3:24:40*/
public class CertificateManger {//证书的map集合private static HashMap<Integer, Certificate> certificateMap = new HashMap<Integer, Certificate>(0);//私有构造方法private CertificateManger (){}//懒加载构建原型模式管理器的单例模式private static CertificateManger certificateManger = null;/*** 获取单例模式的原型模式管理器* <p>Title: getCertificateManger</p>  * @author Liyan  * @date   2017年5月2日 下午3:24:51  * @return CertificateManger*/public static CertificateManger getCertificateManger() {if (certificateManger == null) {certificateManger = new CertificateManger();}return certificateManger;}/*** 加载缓存* <p>Title: getLoad</p>  * @author Liyan  * @date   2017年5月2日 下午3:25:07        */public static void getLoad() {GraduationCertificate certificate1 = new GraduationCertificate();certificateMap.put(1, certificate1);DegreeCertificate certificate2 = new DegreeCertificate();certificateMap.put(2, certificate2);}  /*** 根据key获取克隆后的对象* <p>Title: getCertificate</p>  * @author Liyan  * @date   2017年5月2日 下午3:25:31  * @param key* @return Certificate*/public static Certificate getCertificate(Integer key) {try {Certificate certificate = (Certificate) certificateMap.get(key);if (certificate != null) {Certificate datinfo = (Certificate) certificate.clone();System.out.println("key="+key+"的对象克隆完成,datinfo="+datinfo);return datinfo;}else {System.out.println("key="+key+"并未加载!");return null;}} catch (CloneNotSupportedException e) {e.printStackTrace();}return null;}}

⑤测试

package com.liyan.prototype;
/*** 测试* <p>Title: Test</p>  * @author  Liyan  * @date    2017年5月2日 下午3:30:21*/
public class Test {@SuppressWarnings("static-access")public static void main(String[] args) {//提前加载到缓存数据CertificateManger.getLoad();//获取单例类CertificateMangerCertificateManger manger  = CertificateManger.getCertificateManger();//获取毕业证复印件Certificate certificate1 = manger.getCertificate(1);certificate1.testMethod();//获取学位证复印件Certificate certificate2 = manger.getCertificate(2);certificate2.testMethod();}
}

⑥测试结果

key=1的对象克隆完成,datinfo=Certificate [id=null, name=毕业证]
毕业证复印完成!
key=2的对象克隆完成,datinfo=Certificate [id=null, name=学位证]
学位证复印完成!

图解关系:

 

分析:

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。

独特的优点

(1)性能比直接new一个对象要好的多。因为clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显,所以在需要重复地创建相似对象时可以考虑使用原型模式。

(2)原型模式创建模式不会损坏原有对象

(3)工厂模式对新产品的适应能力比较弱,层级结构比较复杂,没有原型模式简洁

注意事项:

(1)使用原型模式复制对象不会调用类的构造方法。因为clone方法,会直接在内存中复制数据。

(2)单例模式与原型模式是冲突的。因为clone方法直接无视构造方法的权限。

【秒懂设计模式】原型模式相关推荐

  1. 设计模式 原型模式_创新设计模式:原型模式

    设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...

  2. 设计模式 原型模式_设计模式:原型

    设计模式 原型模式 创新设计模式之一是原型设计模式 . 尽管原型是创造模式,但它在概念上与其他模式有所区别. 我的意思是原型在某种意义上创造了自己. 我将在下面解释. 原型模式的所有魔力都基于Java ...

  3. 设计模式 原型模式_原型设计模式:创建另一个小车

    设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...

  4. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

  5. 第六章 Caché 设计模式 原型模式

    文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...

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

    C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...

  7. 设计模式---原型模式(Prototype Pattern)

    在编程中有时候我们会发现,当我们需要一个实例,可是这个实例的创建过程十分复杂,在执行过程中 会消耗大量的时间,同时创建第一个实例和创建第二个时间的初始化信息并未改变.在此种情况下,直接New 一个实例 ...

  8. 精通python设计模式-浅谈Python设计模式 - 原型模式

    声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...

  9. [设计模式]原型模式

    简介 原型模式 (Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式是一种对象创建型模式 (可参考 设计模式 创建型模式). 结构 图-原型模式结构图 Pr ...

  10. Java设计模式——原型模式

    概述 原型模式是为了解决一些不必要的对象创建过程.当Java JDK中提供了Cloneable接口之后,原型模式就变得异常的简单了.虽然由于Cloneable的引入使用程序变得更简单了,不过还是有一些 ...

最新文章

  1. 【linux】Valgrind工具集详解(一):简介
  2. [跟我学UML] UML类图中的泛化
  3. ibmmq 通道命令_IBM_MQ常用命令的.doc
  4. 如何破解无线路由器密码,如何破解WEP密码,破解无线路由器
  5. 【电子信息复试】考研复试常考问题——数据结构
  6. 荐号 | 11个人工智能与大数据相关的个人、企业优质号
  7. JAVA数组Java StringBuffer 和 StringBuilder 类
  8. 9种动态可视化技巧,快速提升可视化大屏能力(附模板)
  9. 为提升在线语音识别效率,他创造了两种升级版算法模型
  10. 使用VirtualEnv在Mac安装TensorFlow
  11. C语言程序设计--宏和预处理
  12. 在elementUI中sort-orders排序,默认为三种,怎么改成两种
  13. Linux 系统不能正常关机解决办法
  14. C#指定图片添加文字——修改版
  15. c++ opencv图像拼接
  16. ANSYS APDL
  17. 界面设计方法 (1) — 1.界面的概念与分类
  18. Python 自学笔记----1.1实例与封装
  19. Photoshop CS5自学学习笔记
  20. JavaIO知识简述

热门文章

  1. 打印机ESC/POS命令集
  2. crontab用法与实例
  3. java获取文件hash值_怎样用java获取到文件的hash值?
  4. onChange和onClick的区别
  5. 高中计算机选修代码,高中信息技术新课标(完整版)
  6. android监听来电去电广播
  7. 熬夜族怎样吃回生命力~~~太实用了
  8. 实收资本和注册资本\营业执照和法人营业执照的区别
  9. Protocol 的用法
  10. 云职教课堂计算机文化基础,智慧职教云课堂西铁院《计算机文化基础》弹性学制网课答案...