原型模式(Prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何的细节.
下面是基本的原型模式的代码
原型类
public interface Prototype{ /** * 克隆自身的方法 * @return 一个从自身克隆出来的对象 */ public Object clone(); }
具体原型类
public class ConcretePrototype1 implements Prototype { public Prototype clone(){ //最简单的克隆,新建一个自身对象,由于没有属性就不再复制值了 Prototype prototype = new ConcretePrototype1(); return prototype; } }
public class ConcretePrototype2 implements Prototype { public Prototype clone(){ //最简单的克隆,新建一个自身对象,由于没有属性就不再复制值了 Prototype prototype = new ConcretePrototype2(); return prototype; } }
客户端代码
public class Client{ /** * 持有需要使用的原型接口对象 */ private Prototype prototype; /** * 构造方法,传入需要使用的原型接口对象 */ public Client(Prototype prototype){ this.prototype = prototype; } public void operation(Prototype example){ //需要创建原型接口的对象 Prototype copyPrototype = prototype.clone(); } }
一般在初始化的信息不发生变化的情况下,克隆是最好的方法,这既隐藏了对象创建的细节,又对性能是大大的提升,无须重新初始化对象,而是动态的获得对象运行时的状态.
浅复制与深复制
原始对象及其复本是引用同一对象的.
浅复制 : 被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象.
如果我们需要把要复制的对象所引用的对象都复制一遍,那么就需要用到深复制了.
深复制 : 深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象.