在编程中有时候我们会发现,当我们需要一个实例,可是这个实例的创建过程十分复杂,在执行过程中

会消耗大量的时间,同时创建第一个实例和创建第二个时间的初始化信息并未改变。在此种情况下,直接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)相关推荐

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

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

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

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

  3. 原型模式(Prototype Pattern)

    原型模式(Prototype Pattern) 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  4. Java设计模式--原型模式Prototype

    原型模式Prototype 原型模式使得用户可以通过复制对象样本来创建新对象.与通过调用构造函数创建对象相比,二者主要区别在于:通过复制创建的新对象一般会包含原始对象的某些状态. 原型模式属于对象的创 ...

  5. 极速理解设计模式系列:4.原型模式(Prototype Pattern)

    四个角色:抽象原型角色(Prototype).具体原型角色(ConcretePrototype).原型管理器角色(PrototypeManager).客户端角色(Client) 抽象原型角色(Prot ...

  6. 设计模式-原型模式(Prototype)

    Specify the kinds of objects to create using a prototypical instance,and create new objects bycopyin ...

  7. 设计模式(23):创建型-原型模式(Prototype)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  8. 设计模式-原型模式(克隆羊多利看了都说好)

    文章目录 引例 原型模式 浅拷贝 深拷贝 引例 标题无意冒犯 在介绍原型模式前,我们先从实际问题出发,对比解决方法前后优劣点. 问题: 现在有一只羊(包含属性:名字Dolly.年龄2),需要克隆10只 ...

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

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

最新文章

  1. mysql innodb myisam 插入数据_mysql innodb换成myisam后插入数据变快?
  2. 家庭安全摄像头:应选择本地还是云端存储?
  3. API-基本数据类型与字符串的互换
  4. 一起谈.NET技术,Visual Studio与C#编程十个实用技巧
  5. python dry原则_关于Python 的这几个技巧,你应该知道
  6. day10 Pyhton学习
  7. 单/双中括号与测试条件
  8. 一位老师,一位领导,一个让全体学生考上目标学校的故事
  9. com.sec.android.app.smartclipservice,EPR Aerospace News
  10. 树莓派智能家居-语音聊天机器人实现
  11. 微课|中学生可以这样学Python(8.4节):递归算法例题讲解1
  12. 如何自学python知乎-如何快速学习python?
  13. c语言 pdf支持库,解决支持库版本兼容问题:引入包时候support包有红色下划线
  14. PAT (Basic Level) Practice1023 组个最小数
  15. easyExcel添加背景水印
  16. 微信强制性诱导分享php,微信公众号运营者注意了,下面这些诱导分享到朋友圈都是不可以的...
  17. html css字体特效,40款CSS+JS文字动画特效html源码
  18. 古典概型——概率论与数理统计(宋浩)
  19. HTML5 canvas基础使用
  20. 企业信息系统架构要点

热门文章

  1. 2019年最新最全运维技能图谱
  2. 预告:Javascript全栈开发的系列文章
  3. 【337天】我爱刷题系列096(2018.01.08)
  4. iOS开发之UIWebView
  5. Android系统中提供的原子操作
  6. 程序员总结:帮助你早些明白一些道理
  7. AjaxPro.2.dll在VS2005使用中的基本使用
  8. ntbackup 创建卷影复制:ffffffff 时出现错误
  9. Android View篇之自定义验证码输入框
  10. Android进阶:七、Retrofit2.0原理解析之最简流程【上】