Java原型模式之基础
一、是什么?
定义:用原型实例指定创建对象的种类,而且通过拷贝这些原型创建新的对象。(官方定义)
原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。
Prototype类须要具备下面两个条件:
1.实现Cloneable接口。
在java语言有一个Cloneable接口,它的作用仅仅有一个,就是在执行时通知虚拟机能够安全地在实现了此接口的类上使用clone方法。在java虚拟机中,仅仅有实现了这个接口的类才干够被拷贝,否则在执行时会抛出CloneNotSupportedException异常。
2.重写Object类中的clone方法。
Java中全部类的父类都是Object类。Object类中有一个clone方法。作用是返回对象的一个拷贝。可是其作用域protected类型的。一般的类无法调用,因此。Prototype类须要将clone方法的作用域改动为public类型。
原型模式是一种比較简单的模式,也非常easy理解。实现一个接口,重写一个方法即完毕了原型模式。在实际应用中,原型模式非常少单独出现。
经常与其它模式混用,它的原型类Prototype也经常使用抽象类来替代。
类型:创建型模式
二、何时用?
有的时候,创建一个对象可能会很耗时,比方对象须要从远程数据库中获取数据来填充又或者创建对象须要读取硬盘文件。
此时,假设已经有了一个对象。再创建对象时,不须要提供专门的new()操作,而是採用复制现有对象的方法,就能够高速完毕对象的创建,这无疑是一种很有效的方式。
三、怎么用?
classPrototype implements Cloneable {
public Prototype clone(){
Prototype prototype = null;
try{
prototype =(Prototype)super.clone();
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return prototype;
}
}
class ConcretePrototype1 extends Prototype{
public void show(){
System.out.println("原型模式实现类1");
}
}
class ConcretePrototype2 extends Prototype{
public void show(){
System.out.println("原型模式实现类2");
}
}
publicclass Client {
public static void main(String[] args){
ConcretePrototype cp = newConcretePrototype();
for(int i=0; i< 10; i++){
ConcretePrototype clonecp =(ConcretePrototype)cp.clone();
clonecp.show();
}
}
}<span style="font-family: SimSun; font-size: 14pt; background-color: rgb(255, 255, 255);"> </span>
四、优缺点:
长处:
1.能够高速创建非常多同样或相似的对象,简化对象的创建过程(由于Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的区别非常明显。
)
2.保存对象的中间状态
3.扩展性好:动态添加降低产品类。
4.简化了创建结构
缺点:每个类必须配备一个克隆方法。因此对已有类进行改造比較麻烦。须要改动其源码,而且在实现深克隆是须要编写较为复杂的代码。
五、总结
以上就是对原型模式基础知识的一个解说,仅仅有对这些基础知识有了了解才会将它进一步优化。让它发挥更大的价值。
那么下一篇就会更深一步的介绍原型模式之浅拷贝和深拷贝。
Java原型模式之基础的更多相关文章
- Java 原型模式(克隆模式)
Java 的设计模式有 23 种,前段时间小编已经介绍了单例模式,由于我们在学习 Spring 的时候在 bean 标签的学习中碰到了今天要讲的原型模式,那么小编就已本文来介绍下原型模式. 原型模 ...
- Java原型模式
原型模式 原型模式也称克隆模式.原型模式jian ming zhi yi,就是先创造出一个原型,然后通过类似于Java中的clone方法,对对象的拷贝,克隆类似于new,但是不同于new.new创造出 ...
- Java原型模式之浅拷贝-深拷贝
一.是什么? 浅拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量仅仅复制引用,不复制引用的对象 深拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制 内部机制: ...
- Java 原型模式
http://www.cnblogs.com/itTeacher/archive/2012/12/02/2797857.html http://www.cnblogs.com/java-my-life ...
- 重学 Java 设计模式:实战原型模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 老板你加钱我的代码能飞 程序员这份工作里有两种人:一类是热爱喜欢的.一类是仅当成工作 ...
- 【设计模式】Java设计模式精讲之原型模式
简单记录 - 慕课网 Java设计模式精讲 Debug方式+内存分析 & 设计模式之禅-秦小波 文章目录 1.原型模式的定义 原型-定义 原型-类型 2.原型模式的实现 原型模式的通用类图 原 ...
- 设计模式总结篇系列:原型模式(Prototype)
首先对原型模式进行一个简单概念说明:通过一个已经存在的对象,复制出更多的具有与此对象具有相同类型的新的对象. 在理解Java原型模式之前,首先需要理解Java中的一个概念:复制/克隆. 在博文< ...
- Java描述设计模式(05):原型模式
本文源码:GitHub·点这里 || GitEE·点这里 一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出 ...
- 深度分析:java设计模式中的原型模式,看完就没有说不懂的
前言 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的 ...
随机推荐
- Swift - 使用UI Dynamics给UIKit组件添加移动吸附行为
UI Dynamics是UIKit的一个新组成部分,它向iOS中的视图提供了与物理学有关的功能和动画.可以让你向视图中引入力和物理属性,可以让你的视图弹跳,舞动,受重力影响等等. 下面通过样例,演示使 ...
- C++ 中使用boost::property_tree读取解析ini文件
boost 官网 http://www.boost.org/ 下载页面 http://sourceforge.net/projects/boost/files/boost/1.53.0/ 我下载的是 ...
- 解决java mail发送TXT附件被直接显示在正文中的问题
这两天遇到一个问题,关于使用java mail发送邮件的问题. 详细是这样子的:我使用java mail发送异常报告邮件,邮件中有一个包含异常日志的附件,和关于设备信息的邮件正文.假设日志为log后缀 ...
- 删除PO
FUNCTION zrfc_mm002. *"---------------------------------------------------------------------- * ...
- Eclipse用法和技巧二:自动生成Main方法1
刚开始编写java小程序,基本都要用到main方法.后期开发大一点的程序,也可以用main方法进行单元测试.总是编写main方法,感觉太无聊了,幸好Eclipse可以帮我们自动生成main方法.见图: ...
- 重操JS旧业第七弹:面向对象与对象创建
JS是一种完全面向对象的程序设计语言,在面向对象处理方面,具有多种多样的实现方式,加之对象成员的动态性使得这门语言更加灵活:而js对象成员动态性也是创建和扩展对象的有力方式. 1 对象成员动态性 属性 ...
- 南京三星面试准备3--数组&基础数据结构
1.用递归颠倒一个栈. void PushToBottom(stack<int> &mystack,int num) { if(mystack.size()==0) { mysta ...
- PB+MS SQL+触发器必须指出
PB+MS SQL+触发器必须指出: 若触发器存在两笔以上的返回值,比方两条update 语句,被误判为数据有改变.存盘不成功. 提示: Row changed between retrieve an ...
- 译文:前端性能的重要性 The Importance of Frontend Performance
欢迎訪问我的主页.最新的文章我会首先公布在个人主页上: http://blog.guaidm.com/shocky/ 原书下载地址:http://pan.baidu.com/s/1pJocRwB 在我 ...
- Swift编程语言学习1.4——数值型字面量、数值类型转换
数值型字面量 整数字面量能够被写作: 一个十进制数,没有前缀 一个二进制数,前缀是0b 一个八进制数,前缀是0o 一个十六进制数,前缀是0x 以下的全部整数字面量的十进制值都是17: let deci ...