原型模式

Prototype (原型)属于创建型模式

意图

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

使用性

当要实例化的类是运行时刻指定时,(通过动态装载 或 为了避免创建一个与产品类层次平行的工厂类层次时);
当一个类的实例只能有几个不同状态组合中的一种时,建立相应数目的原型并克隆它们可能比每次使用合适的状态手工实例化该类更方便一些。

比如我们需要一张Bitmap的几种不同格式:ARGB_8888、RGB_565、ARGB_4444、ALAPHA_8等。那我们就可以先创建一个ARGB_8888的Bitmap作为原型,在它的基础上,通过调用Bitmap.copy(Config)来创建出其它几种格式的Bitmap。另外一个例子就是Java中所有对象都有的一个名字叫clone的方法,已经原型模式的代名词了
简介:在系统中要创建大量的对象,这些对象之间具有几乎完全相同的功能,只是在细节上有一点儿差别。

从java的角度看,一般使用原型模式有个明显的特点,就是实现cloneable的clone()方法。原型模式,能快速克隆出一个与已经存在对象类似的另外一个我们想要的新对象。

效果

(1).创建型模式
(2).运行时刻增加和删除产品
(3).改变只以指定新对象(ctrl+v,然后修改)
(4).改变结构以指定新对象。(类似2,实现不同而已)
(5).减少子类的构造

源码实现

  • android 中的ArrayList
public class ArrayList<E> extends AbstractList<E> implements Cloneable, Serializable, RandomAccess {
/**
 * The number of elements in this list.
 */
int size;

/**
 * 实际存储数据的数值
 */
transient Object[] array;

@Override public Object clone() {
    try {
        ArrayList<?> result = (ArrayList<?>) super.clone();
        result.array = array.clone();
        return result;
    } catch (CloneNotSupportedException e) {
       throw new AssertionError();
    }
}
}
  • Intent
public class Intent implements Parcelable, Cloneable{
    @Override
public Object clone() {
    return new Intent(this);
}

private Intent(Intent o, boolean all) {
    this.mAction = o.mAction;
    this.mData = o.mData;
    this.mType = o.mType;
    this.mPackage = o.mPackage;
    this.mComponent = o.mComponent;
    if (o.mCategories != null) {
        this.mCategories = new HashSet<String>(o.mCategories);
    }
}

Intent 的clone 方法内部并没有调用 super.clone(),使用clone 和 new 需要根据构造对象的成本来决定。如果对象的构造成本较高或者构造较麻烦。那么使用 clone,否则使用new。

推荐阅读更多精彩内容