设计模式(五)———原型模式(Prototype Method):通过复制生成实例

设计模式(五)———原型模式(Prototype Method):通过复制生成实例

Scroll Down

Intent

使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。

应用实例

  • 细胞分裂
  • JAVA 中的 Object clone() 方法

使用场景

  1. 类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等
  2. 通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式
  3. 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用

优点

  • 性能提高
  • 逃避构造函数的约束

缺点

  • 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候
  • 必须实现 Cloneable 接口

注意事项

与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。

Class Diagram

image

public abstract class Prototype {
    abstract Prototype myClone();
}
public class ConcretePrototype extends Prototype {

    private String filed;

    public ConcretePrototype(String filed) {
        this.filed = filed;
    }

    @Override
    Prototype myClone() {
        return new ConcretePrototype(filed);
    }

    @Override
    public String toString() {
        return filed;
    }
}

public class Client {
    public static void main(String[] args) {
        Prototype prototype = new ConcretePrototype("abc");
        Prototype clone = prototype.myClone();
        System.out.println(clone.toString());
    }
}

输出结果:

abc