原型模式
复制这些原型实例来产生新的对象。
原型模式的适用性
原型模式期望一个系统的运行独立于它的产品的创建、构成、表示时,主要适用以下几种场景:
- 当需要实例化的类是在程序的运行时刻来指定的时候。
- 为了频繁的创建一个与产品类层次平行的工厂类层次时。(可以参考工厂方法模式,生成一个新的产品可能会新增一个具体工厂角色类来创建改产品)
- 当一个类的实例只有明确的几种时,建立相应数目的原型在需要的时候克隆它比每次需要用到这个类来手动实例化该类方便时。
原型模式的结构图
原型模式的简易结构图如下:
原型模式通过定义一个抽象原型角色给出一个克隆的接口,然后声明好所需的所有具体原型角色实现抽象原型角色的所有接口,最后通过客户端调用通过复制的方式来实现对象的创建。
原型模式的具体示例
抽象原型角色
public abstract class Prototype implements Cloneable {
public Prototype clone() {
Prototype prototype = null;
try {
prototype = (Prototype) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return prototype;
}
public abstract void shouName();
}
具体原型角色
public class ConcretePrototype1 extends Prototype {
@Override
public void shouName() {
System.out.println("i am ConcretePrototype1");
}
}
public class ConcretePrototype2 extends Prototype{
@Override
public void shouName() {
System.out.println("i am ConcretePrototype2");
}
}
客户端代码
public class Client {
public static void main(String[] args) {
ConcretePrototype1 concretePrototype1 = new ConcretePrototype1();
ConcretePrototype1 clonePrototype = (ConcretePrototype1) concretePrototype1.clone();
System.out.println("克隆对象和被克隆对象比较:" + concretePrototype1.equals(clonePrototype));
concretePrototype1.shouName();
clonePrototype.shouName();
}
}
克隆对象和被克隆对象比较:false
i am ConcretePrototype1
i am ConcretePrototype1
原型管理器来管理原型模式的应用,将所有原型对象注册到该原型管理器中,在需要使用的时候从原型管理器中检索需要的原型对象取出进行复制。
总结
通过使用原型模式可以运行时刻来动态的增加或者减少原型管理器中的原型产品,同时也可以避免像工厂方法中为了新增一种产品而必须创建一个Creator子类的困扰。同时使用原型模式来创建对象通常要比直接new一个对象性能上好得多,因为Clone方法是native方法直接操作内存中的二进制流。
可以通过序列化的方式复制对象实现)。