java设计模式-原型(prototype)

有时候创建对象是需要耗费很多资源,但是每个对象之间又有大量的重复。我们可以选择在创建好一个对象后,以之作为模板克隆出其他对象,稍作修改,即可用于其他地方。

 需要实现Cloneable接口,重写clone()方法。其实就是调用的Object类的clone()方法。

克隆对象只是复制了原对象的数据,每个对象还是独立的,他们的内存地址不同。

/**
 * Created by wangbin10 on 2018/5/18.
 */
public class Prototype2 implements Cloneable,Serializable {
    private static final long serialVersionUID = 2L;
    private String name;
    private Integer payAmount;
    private String msg;

    public Prototype2() {
    }

    public Prototype2(String name, Integer payAmount, String msg) {
        this.name = name;
        this.payAmount = payAmount;
        this.msg = msg;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getPayAmount() {
        return payAmount;
    }

    public void setPayAmount(Integer payAmount) {
        this.payAmount = payAmount;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Prototype2 clone() throws CloneNotSupportedException {
        Prototype2 clone = (Prototype2) super.clone();
        return clone;
    }
}
/**
 * Created by wangbin10 on 2018/5/18.
 */
public class PTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        Prototype2 p1=new Prototype2("zhangsan",23,"hello!welcome to beijing!");
        System.out.println(p1.getName()+p1.getPayAmount()+p1.getMsg());
        Prototype2 p2 = p1.clone();
        p2.setName("lisi");
        p2.setPayAmount(24);
        System.out.println(p2.getName()+p2.getPayAmount()+p2.getMsg());
        System.out.println("============================");
        System.out.println(p1.getName()+p1.getPayAmount()+p1.getMsg());

    }
}