原型模式:

– 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。

– 就是java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点

– 优势有:效率高(直接克隆,避免了重新执行构造过程步骤) 。

– 克隆类似于new,但是不同于new。new创建新的对象属性采用的是默认值。克隆出的 对象的属性值完全和原型对象相同。并且克隆出的新对象改变不会影响原型对象。然后, 再修改克隆对象的值。

原型模式实现:

– Cloneable接口和clone方法

– Prototype模式中实现起来最困难的地方就是内存复制操作,所幸在Java中提供了 clone()方法替我们做了绝大部分事情。

import java.util.Date;

public class Sheep implements Cloneable {
private String sname;
private Date birthday; @Override
protected Object clone() throws CloneNotSupportedException {
Object obj=super.clone(); //实现深复制
Sheep s=(Sheep) obj;
s.birthday=(Date)this.birthday.clone(); return obj;//直接调用object对象的clone();
} public String getSname() {
return sname;
} public void setSname(String sname) {
this.sname = sname;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public Sheep(String sname, Date birthday) {
super();
this.sname = sname;
this.birthday = birthday;
}
public Sheep(){ }
}

  

import java.util.Date;

public class Client {  //浅克隆
public static void main(String[] args) throws Exception{
Date d=new Date(12312321331L);
Sheep s1=new Sheep("baodan",d);
System.out.println(s1);
System.out.println(s1.getSname());
System.out.println(s1.getBirthday()); d.setTime(22234335L); System.out.println(s1.getBirthday()); Sheep s2=(Sheep)s1.clone();
s2.setSname("xiaobaodan");
System.out.println(s2);
System.out.println(s2.getSname());
System.out.println(s2.getBirthday());
}
}

  

import java.util.Date;

//深复制
public class Client2 {
public static void main(String[] args) throws CloneNotSupportedException {
Date d=new Date(12312321331L);
Sheep s1=new Sheep("baodan",d);
Sheep s2=(Sheep)s1.clone(); //深复制
System.out.println(s1);
System.out.println(s1.getSname());
System.out.println(s1.getBirthday()); d.setTime(22234335L); System.out.println(s1.getBirthday());
//Sheep s2=(Sheep)s1.clone();//浅复制 s2.setSname("xiaobaodan");
System.out.println(s2);
System.out.println(s2.getSname());
System.out.println(s2.getBirthday());
}
}

  序列化和反序列化实现深克隆。

ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos); oos.writeObject(s1);
byte[] bytes=bos.toByteArray(); ByteArrayInputStream bis=new ByteArrayInputStream(bytes);
ObjectInputStream ois=new ObjectInputStream(bis); Sheep s2=(Sheep)ois.readObject();

   通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式

如果需要短时间创建大量对象,并且new的过程比较耗时。则可以考虑使用原型模式!

public class Client4 {
public static void testNew(int size){
long start = System.currentTimeMillis();
for(int i=0;i<size;i++){
Laptop t = new Laptop();
}
long end = System.currentTimeMillis();
System.out.println("new的方式创建耗时:"+(end-start));
} public static void testClone(int size) throws CloneNotSupportedException{
long start = System.currentTimeMillis();
Laptop t = new Laptop();
for(int i=0;i<size;i++){
Laptop temp = (Laptop) t.clone();
}
long end = System.currentTimeMillis();
System.out.println("clone的方式创建耗时:"+(end-start));
} public static void main(String[] args) throws Exception {
testNew(1000);
testClone(1000);
}
} class Laptop implements Cloneable {
public Laptop() {
try {
Thread.sleep(10); //模拟创建对象耗时的过程!
} catch (InterruptedException e) {
e.printStackTrace();
}
} @Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone(); //直接调用object对象的clone()方法!
return obj;
}
}

  

最新文章

  1. arcgis for flex展示GIS基本功能
  2. 日期时间组件 - layui.laydate
  3. Oracle性能优化
  4. 解决linux下unzip中文有乱码的问题
  5. 从网页(WEB)登录SAP
  6. Linux 网络故障排查
  7. perl 监控数据库用到的数据结构
  8. H1标签使用的七大注意事项
  9. 如何判断手机收有几张SIM卡
  10. 基于visual Studio2013解决C语言竞赛题之0521圆盘求和
  11. JWT 多网站单点登录,放弃session
  12. 雷云Razer Synapse2.0使用测评 -第二次作业
  13. 硬核机器学习干货,手把手教你写KNN!
  14. log4net 写入 mongodb+Mongodb记录日志
  15. Ambari2.6.2 HDP2.6.5 大数据集群搭建
  16. Linux 关机、重启 命令
  17. Android中为什么需要服务?
  18. 068 Oozie任务调度框架
  19. 【CSS】Sass理解
  20. cookie添加删除修改

热门文章

  1. SQL中的视图(极客时间)
  2. IBM LOTUS DOMINO 9 部署SSL证书
  3. pytest中怎么实现参数化?
  4. 学习9:MongoDB知识
  5. CMS收集器和G1收集器 他们的优缺点对比 G1只有并发标记才不会stop-the-world 其他都会停下来(阿里多次问到)
  6. 201871010108-高文利《面向对象程序设计(java)》第八周学习总结
  7. 【软件工程1916|W(福州大学)_助教博客】2019年上学期期末问卷调查结果公示
  8. pikachu SQL-Injection
  9. luoguP4294 [WC2008]游览计划
  10. minio select api 试用