原型模式:
首先普及浅复制与深复制的定义。
1、定义:原型模式就是通过一个原型对象来表明要创建的对象类型,然后用复制这个对象的方法来创建更痛类型的对象。
2、原理:有两部分组成,抽象原型和具体原型。
3、使用时机:系统需要 创建吃的对象是动态加载的,而且产品具有一定层次时,可以考虑使用原型模式。
1>当要实例化的类是在运行时刻指定时,例如,通过动态装载;
2>或者为了避免创建一个与产品类层次平行的工厂类层次时;
3>或者当一个类的实例只能有几个不同状态组合中的一种时。
4>建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
4、效果:
1>可以再运行时刻增加和删除产品。
2>可以通过改变值来指定产品。
3>可以通过改变结构来指定新对象。
4>减少子类的构造
5>可以用类动态配置应用。
5、实现:
1>使用一个原型管理器
2>实现克隆操作(浅拷贝和深拷贝)
3>初始化克隆对象。
6、使用原型模式的意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
7、解决的问题:
比如有一个对象,在某一时刻该对象中已经包含了一些有效的值,此时可能会需要一个和该对象完全相同的新对象,并且此后对新对象的任何改动都不会影响到原来对象中的值,也就是说新对象与原来的对象是两个独立的对象,但新对象的初始值是由原来的对象确定的。
Clone:
赋值创建对象:
1>java中赋值创建对象是可以实现对象的重用的,但是新对象和原对象是同一个引用;如果修改其中的一个对象的值,则另外的一个对象也会发生改变。
2>使用clone方法会返回对象的一个拷贝,这样一来,如果修改一个对象的值,则另外的对象不会发生改变的。
原型模式UML图:
请注意,在这边Cloneable并非指Java中的java.lang.Cloneable,而是指支持原型复制的对象,必须实作之公开协议。
不同的语言可能提供不同程度支持之对象复制技术,以Java而言,java.lang.Object本身即定义有clone()方法,因此所有的对象基本上皆具自我复制之能力,不过真正要让对象支持复制,则对象必须实作java.lang.Cloneable这个标示接口(Tag interface)。
原型模式浅拷贝与原型模式深度拷贝:
看看这样一个示例:有个类(DogClone)实现了Java的Cloneable接口,也实现了Object的clone()方法,它持有另一个没有实现Cloneable接口并且没有复写Object的clone()方法的引用(Dog)。如果Dog同时实现了clone()方法也实现了Cloneable接口,在对DogClone做科隆操作的时候会不会影响dog的值呢?
区别就是重载了clone函数,由浅复制到了深复制。
@Override
public Dog clone() throws CloneNotSupportedException {
return (Dog)super.clone();
}
转载:http://www.cnblogs.com/jqbird/archive/2011/08/19/2145417.html