原型模式

原型模式:用一个已经创建的对象作为原型,通过复制或者克隆来创建一个和原型相同或相似的新对象。原型实例指定了要创建的对象的种类。

原型模式中的角色

抽象原型类:规定了具体原型对象必须实现的接口。(相当于一个抽象类,但不是要被复制的对象,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。

你可能感兴趣的:(原型模式)