005.设计模式之原型模式

来源:互联网 发布:时差7小时 知乎 编辑:程序博客网 时间:2024/05/21 06:31

原型模式:
概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。不需要知道细节。
优点:
1.使用原型创建对象比new一个对象,在性能上要好很多(Object中的clone方法是本地方法,直接操作内存中的二进制流)。
2.简化对象的创建。
使用场景:
1.需要在循环中或者创建过程复杂的对象的时候
注意事项:
1.使用原型模式复制对象不会调用类的构造方法。因为对象的复制是通过调用Object类的clone方法来完成
的,它直接在内存中复制数据,因此不会调用到类的构造方法。不但构造方法中的代码不会执行,甚至连访
问权限都对原型模式无效。还记得单例模式吗?单例模式中,只要将构造方法的访问权限设置为private
型,就可以实现单例。但是clone方法直接无视构造方法的权限,所以,单例模式与原型模式是冲突的,在使
用时要特别注意。
2.深拷贝与浅拷贝。Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对
象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另
行拷贝。

原型图

项目目录

package com.shenghuoquaner.design.prototype;public class Work implements Cloneable {    private String date;    private String location;    public String getDate() {        return date;    }    public void setDate(String date) {        this.date = date;    }    public String getLocation() {        return location;    }    public void setLocation(String location) {        this.location = location;    }    @Override    protected Object clone() throws CloneNotSupportedException {        return super.clone();    }}
package com.shenghuoquaner.design.prototype;public class Prototype implements Cloneable {    private int type1;    private String type2;    private Work work;    public Prototype() {        work = new Work();    }    public void setShallowPrototypeValue(int type11, String type22) {        this.type1 = type11;        this.type2 = type22;    }    public void setWorkClone(Work work) {    }    public void setShallowPrototypeObject(String date, String location) {        work.setDate(date);        work.setLocation(location);    }    public void show1() {        System.out.println("int的值为:" + type1);        System.out.println("String的值为:" + type2);    }    public void show2() {        System.out.println("工作时间:" + work.getDate());        System.out.println("工作地点:" + work.getLocation());    }    @Override    protected Prototype clone() {        Prototype shallowPrototype = null;        try {            shallowPrototype = (Prototype) super.clone();            work = (Work) shallowPrototype.work.clone();        } catch (CloneNotSupportedException e) {            e.printStackTrace();        }        return shallowPrototype;    }}
package com.shenghuoquaner.design.prototype;public class Test {    public static void main(String[] args) {        Prototype sp1 = new Prototype();        sp1.setShallowPrototypeValue(11, "11");        sp1.setShallowPrototypeObject("11", "11");        Prototype sp2 = (Prototype) sp1.clone();        sp2.setShallowPrototypeValue(22, "22");        sp2.setShallowPrototypeObject("22", "22");        Prototype sp3 = (Prototype) sp1.clone();        sp3.setShallowPrototypeValue(33, "33");        sp3.setShallowPrototypeObject("33", "33");        sp1.show1();        sp1.show2();        sp2.show1();        sp2.show2();        sp3.show1();        sp3.show2();    }}
0 0
原创粉丝点击