原型模式

2016年11月24日

介绍

我理解的原型,即所有使用原型对象的地方,都是使用的原型对象的拷贝,所有使用的地方都是拿到原型对象的当前状态.

解决问题: 创建重复对象,同时保证性能.

UML图

代码

原型接口

    public interface Prototype<T> extends Cloneable {
        T clone();
    }

原型模式类

      public class ConcretePrototype implements Prototype<ConcretePrototype> {

          public ConcretePrototype clone() {
              try {
                  return (ConcretePrototype) super.clone();
              } catch (CloneNotSupportedException e) {
                  e.printStackTrace();
              }
              return null;
          }
      }

使用者

  public class Client {

    public static void main(String[] args) {
        Prototype<ConcretePrototype> concretePrototype = new ConcretePrototype();
        Prototype<ConcretePrototype> cloneObj = concretePrototype.clone();

        System.out.println(concretePrototype == cloneObj);
        System.out.println(concretePrototype.getClass().equals(cloneObj.getClass()));
      }

    }        

其他

当实现了 Cloneable 接口后, JVM 对于clone() 方法的默认实现是, 对基本类型深度拷贝, 其他类对象都是只拷贝了对象引用.所以如果需要实现完全深度拷贝的话,需要自己手动拷贝.例如:

    public class Example implements Cloneable {

        private ArrayList<String> list;

        @Override
        public Example clone() throws CloneNotSupportedException {
                Example cloneObj = (Example)super.clone();
                cloneObj.list = (ArrayList<String>) list.clone();
                return cloneObj;
        }

    }

参考

http://www.cnblogs.com/zxy562323273/p/3559832.html

http://www.cnblogs.com/java-my-life/archive/2012/04/11/2439387.html