原型模式

310 阅读1分钟

概念

有一个样板实例(即原型),用户从这个样板实例对象中复制出一个内部属性一致的对象。一般用于创建复杂的或构造耗时的实例,因为这时通过复制(copy)一个实例比重新构建(new)更快。缺点是由于直接在内存中拷贝,不会执行构造函数,开发时要注意。

使用场景

  • 类初始化需要消耗很多资源时
  • 通过new产生一个对象须繁琐的数据准备和访问权限时。
  • 一个对象需要提供给其他对象访问,且调用者可能都需要修改其值,所以需要利用原型模式进行保护性拷贝(比如用户登录信息LoginSession)

实现方式

实现原型模式的方式有多种,其中通过实现Cloneable接口的原型模式调用close构造实例其实未必比new创建快。

  • Prototype:抽象类或接口,声明具有clone能力
  • ConcretePrototype:具体的原型类
/*
Cloneable 代表 Prototype,WordDocument代表ConcretePrototype
*/
public class WordDocument implements Cloneable {
    private String text;
    private ArrayList<String> images = new ArrayList();

    @Override
    protected WordDocument clone(){//因为clone不屌用构造函数,所以需要注意若构造函数内有特殊逻辑处理情况
        try{
            WordDocument doc = (WordDocument) super.clone();
            doc.text = this.text; 
            doc.images = this.images;
            /*上面是浅拷贝:将副本文档字段引用指向原始文档字段(这样会导致修改其中一个文件的images另一个也会受到影响),
            所以为了保护性拷贝,应该实现深拷贝:拷贝对象时,对引用类型的字段也要采用拷贝形式.
            doc.images = (ArrayList<String>)this.images.clone();
            */
            return doc;
        }catch (Exception e){

        }
        return null;
    }
    //...其他getter和setter
}