原型模式

《android设计模式》读书笔记,如有侵权,请联系我删除,谢谢


一。定义
  原型模式就是有一个样板实例,用户从这个实例中复制出一个内部属性一致的对象,这个过程就是俗称的克隆,被复制的对象就是原型,这个原型是可定制的。
  原型模式多用于创建复杂的或者构造好事的实例,因为这种情况下,复制一个已经存在的实例可是程序运行更高效。
二。使用场景
  类初始化需要消化非常多的资源,这个资源包括数据,硬件资源等,通过原型拷贝避免这些消耗
  通过new产生一个对象需要非常繁琐的数据转呗或访问权限,这是可以使用原型模式
  一个对象需要提供其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。
三。实现原型
  通过实现Cloneable接口和复写clone()方法实现原型模式。
**************************************************************************************
package com.yinazh.test;

import java.util.ArrayList;
import java.util.List;

public class WordDocument implements Cloneable {

private String mText;
private ArrayList<String> mImages = new ArrayList<String>();

public WordDocument(){}

protected WordDocument clone(){

WordDocument doc;
try {
doc = (WordDocument)super.clone();
doc.mText = this.mText;
//直接引用,浅拷贝,复制的对象与原始对象的内容指向同一个地址
//doc.mImages = this.mImages;
//深拷贝,重新创建一个对象
doc.mImages = (ArrayList<String>)this.mImages.clone();
return doc;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}

public String getText(){
return mText;
}

public void setText(String mText){
this.mText = mText;
}

public List<String> getImages(){
return mImages;
}

public void addImage(String img){
this.mImages.add(img);
}

public void showDocument(){
System.out.println(mText);
for(String imgName : mImages){
System.out.println(imgName);
}
}

}
**************************************************************************************
 注意:通过clone拷贝对象时并不会执行构造函数。因此如果在构造函数中需要一些特殊的初始化操作的类型,在使用Cloneable实现拷贝时,需要注意构造函数不会执行的问题。
  此时在拷贝的时候,需要考虑原型成成员的类型,如果是对象,则需要考虑深拷贝,浅拷贝的问题。
  此处,建议尽量使用深拷贝,避免操作副本时影响原始对象的问题。
四。总结
  原型模式本质上就是对象拷贝,容易出现问题的就是深拷贝与浅拷贝。
  在某个对象对外可能是只读的,为了防止外部对这个只读对象修改,通常通过一个对象拷贝的形式实现只读的限制。
优点:原型模式是内存中二进制流的拷贝,要比直接new一个对象性能要好,特别是要在一个循环体中产生大量的对象时,原型模式可以更好的突出其优点
缺点:直接在内存中拷贝,构造函数是不执行的,实际开发中要注意这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值