【秒懂设计模式】原型模式
秒懂设计模式——原型模式
(五)原型模式
【官方定义】用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象,属于对象创建模式。
【举例】在找工作的时候,通常需要我们的毕业证和学位证,但是我们一般不会把原件(原型实例)给到用人单位,而是会把原件复印(拷贝)几份,然后供用人单位使用。
【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方法直接无视构造方法的权限。
【秒懂设计模式】原型模式相关推荐
- 设计模式 原型模式_创新设计模式:原型模式
设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...
- 设计模式 原型模式_设计模式:原型
设计模式 原型模式 创新设计模式之一是原型设计模式 . 尽管原型是创造模式,但它在概念上与其他模式有所区别. 我的意思是原型在某种意义上创造了自己. 我将在下面解释. 原型模式的所有魔力都基于Java ...
- 设计模式 原型模式_原型设计模式:创建另一个小车
设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...
- Java常用设计模式————原型模式(一)
介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...
- 第六章 Caché 设计模式 原型模式
文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...
- C++设计模式——原型模式(Prototype Pattern)
C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...
- 设计模式---原型模式(Prototype Pattern)
在编程中有时候我们会发现,当我们需要一个实例,可是这个实例的创建过程十分复杂,在执行过程中 会消耗大量的时间,同时创建第一个实例和创建第二个时间的初始化信息并未改变.在此种情况下,直接New 一个实例 ...
- 精通python设计模式-浅谈Python设计模式 - 原型模式
声明,本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在<精通Python设计模式>中把设计模式分为三种类型: 创建型模式 ...
- [设计模式]原型模式
简介 原型模式 (Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式是一种对象创建型模式 (可参考 设计模式 创建型模式). 结构 图-原型模式结构图 Pr ...
- Java设计模式——原型模式
概述 原型模式是为了解决一些不必要的对象创建过程.当Java JDK中提供了Cloneable接口之后,原型模式就变得异常的简单了.虽然由于Cloneable的引入使用程序变得更简单了,不过还是有一些 ...
最新文章
- 【linux】Valgrind工具集详解(一):简介
- [跟我学UML] UML类图中的泛化
- ibmmq 通道命令_IBM_MQ常用命令的.doc
- 如何破解无线路由器密码,如何破解WEP密码,破解无线路由器
- 【电子信息复试】考研复试常考问题——数据结构
- 荐号 | 11个人工智能与大数据相关的个人、企业优质号
- JAVA数组Java StringBuffer 和 StringBuilder 类
- 9种动态可视化技巧,快速提升可视化大屏能力(附模板)
- 为提升在线语音识别效率,他创造了两种升级版算法模型
- 使用VirtualEnv在Mac安装TensorFlow
- C语言程序设计--宏和预处理
- 在elementUI中sort-orders排序,默认为三种,怎么改成两种
- Linux 系统不能正常关机解决办法
- C#指定图片添加文字——修改版
- c++ opencv图像拼接
- ANSYS APDL
- 界面设计方法 (1) — 1.界面的概念与分类
- Python 自学笔记----1.1实例与封装
- Photoshop CS5自学学习笔记
- JavaIO知识简述