(设计模式)原型

用原型实例指定创建对象的种类,并且通过clone方法复制这些原型,创建新的对象。
1.当一个系统应该独立于它的产品创建、构成和表示时。
2.当要实例化的类是在运行时刻指定时,例如,通过动态装载。
3.为了避免创建一个与产品类层次平行的工厂类层次时。
4.当一个类的实例只能有几个不同状态组合中的一种时。 建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
通过克隆会复制他的状态数据等,但是这是他是新的对象,拥有独立的地址。
 
克隆基类
/**
 * 声明一个克隆之身的基类
 * 继承Cloneable 接口
 * Created by 灰灰 on 2017/6/30.
 */
public class Prototype implements Cloneable {
    /**
     * 调用克隆接口,克隆自身
    * @Author : 灰灰
    * @Date : 2017/6/30 13:55
    */
    public Object clone() {
        try{
            return super.clone();
        }catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
子类,原型对象
/**
 *需要克隆的子类类
 * 继承克隆基类,获得克隆方法
 * Created by 灰灰 on 2017/6/30.
 */
public class ConcretePrototype extends Prototype {
    public ConcretePrototype(String name) {
        setName(name);
    }
}
测试
public static void main(String[] args) {
    Prototype prototype = new ConcretePrototype("prototype");
    Prototype prototype1 =new TestPrototype("test");
    Prototype child = (Prototype)prototype.clone();
    Prototype child1 = (Prototype) prototype1.clone();
    System.out.println(prototype.getName());
    System.out.println(child.getName());
    System.out.println(prototype1.getName());
    System.out.println(child1.getName());
    System.out.println(prototype);
    System.out.println(child);
    System.out.println(prototype1);
    System.out.println(child1);
}