原型模式
文章目录
概述
原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。
原型模式是一种对象创建型模式,将一个原型对象传给要发动创建的对象(即客户端对象),这个要发动创建的对象通过请求原型对象拷贝自己来实现创建过程。原型模式是一种特殊的创建型模式,它通过复制一个已有对象来获取更多相同或相似的对象。创建克隆对象的工厂就是原型类自身,工厂方法由克隆方法来实现。克隆方法创建的对象是全新的对象,在内存中拥有新的地址,对克隆产生的对象进行修改不会对原型对象造成影响。
结构
原型模式包含以下3个角色:
Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,它可以是抽象类也可以是接口,甚至还可以是具体实现类。
ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。
结构实现
浅克隆与深克隆
根据在复制原型对象的同时是否复制包含在原型对象中引用类型的成员变量,原型模式的克隆机制分为两种:浅克隆(Shallow Clone)和深克隆(Deep Clone)。
浅克隆
在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;
如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。
简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。
深克隆
无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制。
实现
实现原型模式的关键在于如何实现克隆方法,下面介绍两种在Java语言中常用的克隆实现方法。
通用实现方法
通用的克隆实现方法是在具体原型类的克隆方法中实例化一个与自身类型相同的对象并将其返回,并将相关的参数传入新创建的对象中,保证它们的成员属性相同。
public abstract class Prototype{
public abstract Prototype clone();
}
class ConcretePrototype implements Prototype{
private String attr; //成员变量
public void setAttr(String attr){
this.attr = attr;
}
public String getAttr(){
return this.attr;
}
//克隆方法
public Prototype clone(){
Prototype prototype = new ConcretePrototype(); //创建新对象
prototype.setAttr(this.attr);
return prototype;
}
}
在客户类中我们只需要创建一个ConcretePrototype对象作为原型对象,然后调用其clone()方法即可得到对应的克隆对象:
ConcretePrototype prototype = new ConcretePrototype();
prototype.setAttr("Sunny"