依赖关系的倒置
抽象不应该依赖于实现细节,实现细节应该依赖于抽象。
意图
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
结构
-
Prototype(抽象原型类):**它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类。
-
ConcretePrototype(具体原型类):**它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
-
Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。
原型模式的要点
- 原型模式的核心是一个clone方法,通过该方法进行对象的拷贝,Java提供了一个Cloneable接口来标识这个对象是可拷贝的。要重写Object类中的clone方法!
//原型模式通用源码
public class PrototypeClass implements Cloneable {
//重写父类Object方法
@Override
public PrototypeClass clone() {
PrototypeClass prototypeClass = null;
try{
prototypeClass = (PrototypeClass) super.clone();
}catch(CloneNotSupportedException e){
//异常处理
}
}
}
-
对象在拷贝时构造函数不会被执行
-
浅拷贝——只拷贝对象地址,深拷贝——拷贝对象的所有数据
-
要使用clone方法,类的成员变量上不要增加final关键字