`

4、原型模式

 
阅读更多

原型模式

1、结构

原型类必须实现一个标示接口Cloneable,表示这个类支持复制,否则调用clone方法会报CloneNotSupportException异常。

 

2、浅克隆和深克隆

(1)浅克隆

被复制对象的所有变量都与原来的对象相同,而所有对其他对象的引用都指向原来的对象。

(2)深克隆

深克隆不仅被复制的所有变量与原理啊对象相同,而且其他对象的引用也会被创建一个新对象。

 

3、代码

原型类

public class Prototype implements Cloneable {
	
	private ArrayList list = null;
	
	
	public Prototype() {
		super();
		list = new ArrayList();
		for(int i = 0; i < 10000; i++){
			list.add("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+i);
		}
	}

	@Override
	protected Object clone() throws CloneNotSupportedException {
		Prototype p = null;
		p = (Prototype)super.clone();
		p.list=(ArrayList)this.list.clone();
		return p;
	}

	public ArrayList getList() {
		return list;
	}

	public void setList(ArrayList list) {
		this.list = list;
	}
	
}

 

原型子类

public class ConcretePrototype extends Prototype implements Serializable{
	
	public void show(){
		System.out.println("原形模型实现类-->"+this);
	}
	
	/**
	 * 通过串行化实现深度克隆
	 * @return
	 * @throws Exception
	 */
	public Object deepClone() throws Exception{
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(baos);
		oos.writeObject(this);
		
		ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
		ObjectInputStream ois = new ObjectInputStream(bais);
		return ois.readObject();
	}

}

 

测试类

public class Client {
	
	/**
	 * 原型模式测试
	 * 通过测试通过clone获得10000个对象用时516毫秒,通过new方法获得10000个对象用时42047毫秒,第三种deepClone获得10000个对象用时41880毫秒。
	 * 因此
	 * 1、性能好:
	 * 通过clone获得对象要比new获得一个对象在性能上好的多。
	 * 主要是在对象构造方法中存在大量的数据处理,而clone过程是二进制流的拷贝,不会执行构造方法
	 * 2、简化对象的操作
	 * 只要通过clone方法就可以获得一个新的对象。(并且属性和主对象一致)
	 * @param args
	 * @throws CloneNotSupportedException
	 */
	public static void main(String[] args) throws CloneNotSupportedException {
		Date start = new Date();
		ConcretePrototype prototype = new ConcretePrototype();
		for(int i = 0; i < 10000; i++){
//			ConcretePrototype p = (ConcretePrototype)prototype.clone();
//			ConcretePrototype p = new ConcretePrototype();
			ConcretePrototype p = null;
			try {
				p = (ConcretePrototype)prototype.deepClone();
			} catch (Exception e) {
				e.printStackTrace();
			}
			p.show();
		}
		Date end = new Date();
		System.out.println(end.getTime() - start.getTime());
	}

}

 

 

4、总结

(1)、性能好:
通过clone获得对象要比new获得一个对象在性能上好的多。
主要是在对象构造方法中存在大量的数据处理,而clone过程是二进制流的拷贝,不会执行构造方法
(2)、简化对象的操作
只要通过clone方法就可以获得一个新的对象。(并且属性和主对象一致)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics