原型模式是创建型模式。

设计意图:用原型实例指定创建对象的类型,并通过拷贝这个原型来创建新的对象。

我们使用构建简历的样例的类图来说明原型模式。

类图:

原型模式主要用于对象的复制。它的核心是就是类图中的原型类Prototype。这里我们定义了一个抽象的原型接口,声明了用于clone自己的方法,这里我们已创建简历为详细原型类,Prototype类须要具备下面两个条件:

  • 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用仅仅有一个。就是在执行时通知虚拟机能够安全地在实现了此接口的类上使用clone方法。

    在java虚拟机中,仅仅有实现了这个接口的类才干够被拷贝,否则在执行时会抛出CloneNotSupportedException异常。

  • 重写Object类中的clone方法。

    Java中,全部类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,可是其作用域protected类型的。一般的类无法调用,因此。Prototype类须要将clone方法的作用域改动为public类型。

原型模式是一种比較简单的模式,也非常easy理解,实现一个接口,重写一个方法即完毕了原型模式。在实际应用中,原型模式非常少单独出现。经常与其它模式混用,他的原型类Prototype也经常使用抽象类来替代,这里我们在原型类上加了一个接口。该接口类继承的Cloneable接口,这样我们能够在我们自己接口中更灵活的控制详细原型类的逻辑是什么。

package com.prototype;

/**
* @author gaoxu
* 实践出真知!
*/
public interface IPrototype extends Cloneable{ public Prototype clone();
public void show(); }
package com.prototype;

/**原型抽象类。採用原型抽象类。能够使详细原型类有很多其它的可复用的属性实现
* @author gaoxu
* 实践出真知。
*/
public abstract class Prototype implements IPrototype{
String name = "";
String mobile = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
@Override
public Prototype clone() {
Prototype prototype = null;
try {
prototype = (Prototype) super.clone();
} catch (CloneNotSupportedException e) { e.printStackTrace();
}
return prototype;
} public String toString(){
return "mobile="+mobile+",name="+name;
}
}
package com.prototype;

/**
* 简历原型实现类
*
* @author gaoxu 实践出真知。
*/
public class Resume extends Prototype { @Override
public void show() { System.out.println(""+toString());
} }
package com.prototype;

/**
* @author gaoxu
* 实践出真知! */
public class Client { /**
* @param args
*/
public static void main(String[] args) { Resume resume = new Resume();
resume.setName("高旭");
resume.setMobile("1390000111"); Resume resume1 = (Resume) resume.clone();
Resume resume2 = (Resume) resume.clone(); System.out.println(resume.toString());
System.out.println(resume1.toString());
System.out.println(resume2.toString()); } }

原型模式的长处和适用场景:

最大的长处就是创建对象性能好。比new要快不少,由于Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的区别很明显。所以须要反复创建对象的场景基本都能够适用。

原型模式的注意事项

  • 使用原型模式复制对象不会调用类的构造方法。由于对象的复制是通过调用Object类的clone方法来完毕的,它直接在内存中复制数据。不用又一次初始化,直接获得对象执行时的状态。

    不但构造方法中的代码不会执行,甚至连訪问权限都对原型模式无效。

    单例模式中,仅仅要将构造方法的訪问权限设置为private型。就能够实现单例。可是clone方法直接无视构造方法的权限。所以,单例模式与原型模式是冲突的,所以不能把单例模式的类对象进行拷贝,那样就不是单例了。

跟着实例学习设计模式(7)-原型模式prototype(创建型)的更多相关文章

  1. 原型模式 prototype 创建型 设计模式(七)

    原型模式  prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象   显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...

  2. Java设计模式05:常用设计模式之原型模式(创建型模式)

    1. Java之原型模式(Prototype Pattern)     原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. ...

  3. 设计模式05: Prototype 原型模式(创建型模式)

    Prototype 原型模式(创建型模式) 依赖关系的倒置抽象不应该依赖于实现细节,细节应该依赖于抽象.对所有的设计模式都是这样的. -抽象A直接依赖于实现细节b -抽象A依赖于抽象B,实现细节b依赖 ...

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

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  5. 二十四种设计模式:原型模式(Prototype Pattern)

    原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...

  6. 创建型设计模式之原型模式(Prototype)

    结构   意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者 为了避免创建一个与产品类层次平行的工厂类层次时:或 ...

  7. 设计模式 笔记 原型模式 prototype

    //---------------------------15/04/07---------------------------- //prototype 原型模式--对象创建型模式 /* 1:意图: ...

  8. [设计模式] 4 原型模式 prototype

    设计模式:可复用面向对象软件的基础>(DP)本文介绍原型模式和模板方法模式的实现.首先介绍原型模式,然后引出模板方法模式. DP书上的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ...

  9. python 设计模式之原型模式 Prototype Pattern

    #引入 例子1: 孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递.”顾客说.“寄往什么地方?寄给……?”你问.“和上次差不多一样,只是邮 ...

  10. 【UE4 设计模式】原型模式 Prototype Pattern

    概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...

随机推荐

  1. JavaScript正则表达式-字符类

    字符列表 在方括号内指定一个或者多个字符组成的字符列表,与字符列表中任意字符匹配,都被认为是匹配的.每次匹配只能匹配列表中的一个字符. str = "bird,head,fed,meadow ...

  2. document文档碎片

    var arrText = ["1","2","3","4","5","6",& ...

  3. lfyzoj104 Counting Swaps

    问题描述 给定你一个 \(1 \sim n\) 的排列 \(\{p_i\}\),可进行若干次操作,每次选择两个整数 \(x,y\),交换 \(p_x,p_y\). 请你告诉穰子,用最少的操作次数将给定 ...

  4. Jmeter性能指标分析-下载了服务器监控插件的各个组件的功能介绍

    1.jp@gc - Actiive Threads Over Time:不同时间的活动用户数量展示(图表) 当前的时间间隔是1毫秒,在setting中可以设置时间间隔以及其他的参数 2.jp@gc - ...

  5. ZingChart 图表插件

    ZingChart提供了一个丰富的API,用于通过重新绘制绘图(重新加载) ,加载新数据(setseriesdata),修改现有图表(modifyplot), 放大数据范围(zoomto),切换各种交 ...

  6. Codeforces Round #415 (Div. 2) 翻车啦

    A. Straight «A» time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  7. 【HTML/XML 2】XML基础知识点总结

    导读:刚开始看到这个名的时候,还以为会和HTML一样呢,结果看完了资料里的视频,才发现是各有千秋.现在,就对XML的基础知识,做一个总结. 一.总体概述 XML(Extensible Markup L ...

  8. 在windows下安装flex和bison、GCC

    学习Stellar-core 需要依赖项flex .bison .gcc三个依赖项 下载得网址:链接: https://pan.baidu.com/s/1mitCLcs 密码: 3jaj   通过 w ...

  9. SPOJ-Matrices with XOR property,暴力打表!

    Matrices with XOR property 应该先去看看这题的,补题的时候发现这题其实挺简单的.. 题意:n*m的格子用1-n*m的数去填,要求如果一个格子(i1,j1)与另外一个格子(i2 ...

  10. [BZOJ1419] Red is good(期望DP)

    传送门 逆推 只不过顺序还是顺着的,思想是逆着的 f[i][j]表示还剩下i张红牌,j张黑牌的期望值 那么边界是 f[i][0]=i,因为只剩i张红牌 f[0][j]=0,只剩黑牌,显然直接停止最优 ...