原型模式:用一个已经创建的对象作为原型,通过复制或者克隆来创建一个和原型相同或相似的新对象。原型实例指定了要创建的对象的种类。
原型模式中的角色
抽象原型类:规定了具体原型对象必须实现的接口。(相当于一个抽象类,但不是要被复制的对象,extends 一个克隆的接口)
具体原型类:实现抽象原型类的clone方法,他是可被复制的对象。(被复制的对象)
访问类:需要根据原型类进行复制或克隆的具体访问类,使用具体原型类的clone()方法类复制新的对象。
/**
*
* @author ASUS
* 抽象原型类
*/
public interface Prototype extends Cloneable {
/*抛出一个无法克隆的异常*/
public Object clone() throws CloneNotSupportedException;
}
/**
*
* @author ASUS
* 具体原型类 (向访问类提供clone方法)
*/
public class SpecificPrototype implements Prototype{
public SpecificPrototype() {
System.out.println("具体原型类构造函数");
}
/*实现抽象原型类的clone方法*/
@Override
public Object clone() throws CloneNotSupportedException {
System.out.println("具体原型类复制");
return super.clone();
}
}
/**
*
* @author ASUS
* 访问类
*/
public class PrototypeClient {
public static void main(String[] args) throws CloneNotSupportedException {
/*实例具体原型类*/
SpecificPrototype specificPrototype = new SpecificPrototype();
/*克隆*/
SpecificPrototype cloneOnject01 = (SpecificPrototype) specificPrototype.clone();
SpecificPrototype cloneOnject02 = (SpecificPrototype) specificPrototype.clone();
System.out.println("克隆出来的对象相同么?" + (cloneOnject01==cloneOnject02));
}
}
生成相似对象(一部分属性一样,一部分属性值不一样)
原型模式的应用场景
a)对象之间相同或者相似,只是个别几个属性不同。
b)对象创建过程比较麻烦,复制相对简单。
原型管理器
一个map装着很多个实现了抽象原型类的具体原型类。
通过get,put进行管理和调用。通过访问类id取map中的具体类,实际真正访问的还是具体类。
省略向下转型的步骤可以在map中直接装抽象原型类的对象,
但抽象原型类中没有的方法或成员就需要在具体类中定义,并向下转型(map中装抽象原型类的形况下)。
可以将clone方法的调用封装在map的get方法中,这样访问类就不需要在调用clone方法了。每次从管理器中取,就是调用了一次clone。