设计模式---原型模式(Prototype Pattern)
在编程中有时候我们会发现,当我们需要一个实例,可是这个实例的创建过程十分复杂,在执行过程中
会消耗大量的时间,同时创建第一个实例和创建第二个时间的初始化信息并未改变。在此种情况下,直接New
一个实例对象显得太浪费,不合理。
那么如何避免使用new一个实例的方法,提升程序的性能呢?可以通过原型模式改善!
原型模式:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。他允许一个对象创建另一
个可定制的对象,却不关心创建的细节。其工作原理是:通过将一个原型对象传给那个要发动创建的对
象,这个要发动的对象通过请求原型对象拷贝自己来实现创建。
其实说白了原型设计模式就是对对象的复制,说的更直白一些也就是对数据的复制。但是在对数据
进行复制的时候有两个问题是我们必须考虑到的。
● 对象实时状态的复制(也就是对象中基本数据类型的复制)
● 对象引用成员变量的复制。
针对上述两种情况,也就产生了两种复制的效果:
◆浅复制 :针对第一种情况,只复制了基本的数据类型,对于引用类型对象只是单纯的复制了他的
引用还是指向原来引用的对象。java中可以通过Object类的Clone()方法实现浅复制。
◆ 深复制 :针对第二种情况,基本类型和引用类型都进行了新的拷贝,在java中可以通过串行化(实
现Serializable接口),前提是该对象及对象内部的应用类型都是可串行化的。不过实际中
有些对象不必深复制的,可以使用transient进行排除。
举一个简单的例子程序:
考虑这样一个场景,局域网坦克大战的时候,坦克信息的传递,坦克是拥有×××对象的。
×××类:
package com.kiritor; import java.awt.Point; import java.io.Serializable; /** ×××类 */ public class Bullet implements Serializable { private int tank_id; private Point point;// 坐标 public int getTank_id() { return tank_id; } public void setTank_id(int tank_id) { this.tank_id = tank_id; } public Point getPoint() { return point; } public void setPoint(Point point) { this.point = point; } public int getDirect() { return direct; } public void setDirect(int direct) { this.direct = direct; } private int direct;// ×××方向 }
坦克类:
package com.kiritor; import java.awt.Point; import java.io.Serializable; import java.util.ArrayList; public class Tank implements Serializable,Cloneable { private int id; private Point point;// 坐标 private ArrayList<Bullet> bullets = new ArrayList<Bullet>();// 坦克×××集 public int getId() { return id; } public void setId(int id) { this.id = id; } public Point getPoint() { return point; } public void setPoint(Point point) { this.point = point; } public ArrayList<Bullet> getBullets() { return bullets; } public void setBullets(ArrayList<Bullet> bullets) { this.bullets = bullets; } @Override protected Tank clone() throws CloneNotSupportedException { // TODO Auto-generated method stub return (Tank) super.clone(); } }
测试类:
package com.kiritor; import java.awt.Point; public class Prototype { public static void main(String[] args) throws Exception { Tank tank = new Tank(); Bullet bullet = new Bullet(); tank.setPoint(new Point(6, 6));// 初始坐标 System.out.println(tank.getPoint().toString());// 坐标 System.out.println(tank.getBullets().size());// 没有××× Tank tank_copy1 = (Tank) tank.clone(); System.out.println("第一次克隆"); System.out.println(tank_copy1.getPoint().toString()); System.out.println(tank_copy1.getBullets().size()); System.out.println("改变状态之后克隆"); bullet.setDirect(2);// 给tank增加一个×××,并设置方向为2 tank.getBullets().add(bullet); tank.setPoint(new Point(12, 12));// tank的新坐标 Tank tank_copy2 = (Tank) tank.clone(); System.out.println(tank_copy2.getPoint().toString()); System.out.println(tank_copy2.getBullets().size()); System.out.println(tank_copy2.getBullets().get(0).getDirect()); } }
程序的运行结果:
转载于:https://blog.51cto.com/kiritor/1226753
设计模式---原型模式(Prototype Pattern)相关推荐
- C++设计模式——原型模式(Prototype Pattern)
C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
[索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...
- 原型模式(Prototype Pattern)
原型模式(Prototype Pattern) 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...
- Java设计模式--原型模式Prototype
原型模式Prototype 原型模式使得用户可以通过复制对象样本来创建新对象.与通过调用构造函数创建对象相比,二者主要区别在于:通过复制创建的新对象一般会包含原始对象的某些状态. 原型模式属于对象的创 ...
- 极速理解设计模式系列:4.原型模式(Prototype Pattern)
四个角色:抽象原型角色(Prototype).具体原型角色(ConcretePrototype).原型管理器角色(PrototypeManager).客户端角色(Client) 抽象原型角色(Prot ...
- 设计模式-原型模式(Prototype)
Specify the kinds of objects to create using a prototypical instance,and create new objects bycopyin ...
- 设计模式(23):创建型-原型模式(Prototype)
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- 设计模式-原型模式(克隆羊多利看了都说好)
文章目录 引例 原型模式 浅拷贝 深拷贝 引例 标题无意冒犯 在介绍原型模式前,我们先从实际问题出发,对比解决方法前后优劣点. 问题: 现在有一只羊(包含属性:名字Dolly.年龄2),需要克隆10只 ...
- Java常用设计模式————原型模式(一)
介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...
最新文章
- mysql innodb myisam 插入数据_mysql innodb换成myisam后插入数据变快?
- 家庭安全摄像头:应选择本地还是云端存储?
- API-基本数据类型与字符串的互换
- 一起谈.NET技术,Visual Studio与C#编程十个实用技巧
- python dry原则_关于Python 的这几个技巧,你应该知道
- day10 Pyhton学习
- 单/双中括号与测试条件
- 一位老师,一位领导,一个让全体学生考上目标学校的故事
- com.sec.android.app.smartclipservice,EPR Aerospace News
- 树莓派智能家居-语音聊天机器人实现
- 微课|中学生可以这样学Python(8.4节):递归算法例题讲解1
- 如何自学python知乎-如何快速学习python?
- c语言 pdf支持库,解决支持库版本兼容问题:引入包时候support包有红色下划线
- PAT (Basic Level) Practice1023 组个最小数
- easyExcel添加背景水印
- 微信强制性诱导分享php,微信公众号运营者注意了,下面这些诱导分享到朋友圈都是不可以的...
- html css字体特效,40款CSS+JS文字动画特效html源码
- 古典概型——概率论与数理统计(宋浩)
- HTML5 canvas基础使用
- 企业信息系统架构要点