设计模式总结-Prototype模式

一、Prototype模式的实现:
 
1、浅克隆:
 
a. 提供一个类作为克隆的原型,该类实现了Clonable接口
 
b. 在该类中覆盖Object类的clone()方法,采用super.clone()方法完成克隆
 
c. 在外部使用场合先产生一个原型对象,然后调用其clone()方法产生克隆对象

2、深克隆:
 
a. 提供一个类作为克隆的原型,该类实现了Serializable接口
 
b. 在该类中覆盖Object类的clone()方法,采用序列化的方法完成克隆(对象流的读写)
 
c.在外部使用场合先产生一个原型对象,然后调用其clone()方法产生克隆对象


二、Prototype模式与深、浅克隆:

使用Object.clone()方法进行的克隆是“浅克隆”-被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。 换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

浅克隆的步骤如下:

①为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。

②在派生类中覆盖基类的clone()方法,并声明为public。

③在派生类的clone()方法中,调用super.clone()。

④在派生类中实现Cloneable接口。

 

为什么我们在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢?在运行时刻,Object中的clone()要识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中。

要实现“深克隆”-被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。
换言之,深复制把要复制的对象所引用的对象都复制了一遍。

深克隆需要使用Java中提供的对象串行化功能-即把要复制的对象写入到一个缓冲流,然后通过输入流读入,完成对象的复制

例:

try {
   
// 在内存中开辟一块缓冲区,用于将自身写入
   ByteArrayOutputStream bout = new ByteArrayOutputStream();
   ObjectOutputStream out = new ObjectOutputStream(bout);
   
// 通过Serialization机制将自身写入该缓冲区
   
out.writeObject(this);
   out.close();

   // 找到刚才开辟的缓冲区准备读取
   ByteArrayInputStream bin = new ByteArrayInputStream(bout
     .toByteArray());
   ObjectInputStream in = new ObjectInputStream(bin);
   
// 将刚才写入的内容读入一个新的对象
  
 Object ret = in.readObject();
   in.close();

   // 返回这个对象,拷贝完毕
   return ret;
  } catch (Exception e) {
   e.printStackTrace();
   return null;
  }


三、Prototype模式的优、缺点和适用场合:

使用Prototype模式的一个好处就是可以节省大量的接口实现类的编写。采用工厂模式的话,如果分别为用户指定的每种场合都提供一个用户接口工厂类,将会为我们带来繁重的工作量。未来避免用户接口工厂类不断增加,可以考虑使用Prototype模式。

而Prototype模式的一个致命的缺点是:Java中的原型方法不允许新对象拥有与父对象不同的方法。这时候,在使用原型方法之前,需要仔细考虑原型方法的利弊,甚至要试一下Prototype模式是否满足需求。

综上所述:Prototype模式最适用的场合应该是:当几个对象的类仅在属性上存在一点差异,而行为上完全相同时。可以在复制一个原型对象后,对其属性进行细小的微调,从而实现定制化的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值