6.Prototype-原型模式

来源:互联网 发布:mac开机进入客人用户 编辑:程序博客网 时间:2024/06/04 23:28

Prototype 原型模式

  • 原型模式:
    原型模式是创建型模式的一种,其特点在于通过「复制」一个已经存在的实例来返回
    新的实例,而不是新建实例。被复制的实例就是我们所称的「原型」,这个原型是可
    定制的。
    原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在
    的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。

  • 示例类图:
    Prototype_uml

  • 示例代码:

// Prototype Classpublic class Cookie implements Cloneable, Serializable {    private static final long serialVersionUID = 1L;    protected String type = "饼干";    protected Date createTime = new Date();    public void setCreateTime(Date createTime) {        this.createTime = createTime;    }    @Override    public String toString() {        return "[type=" + type + "createTime=" + createTime.getTime() + "] " + hashCode();    }    // 浅复制    @Override    public Cookie clone() {        try {            return (Cookie) super.clone();        } catch (CloneNotSupportedException e) {            e.printStackTrace();        }        return null;    }    // 深复制    public Cookie deepClone() {        try {            // 写入当前对象的二进制流            ByteArrayOutputStream bos = new ByteArrayOutputStream();            ObjectOutputStream oos = new ObjectOutputStream(bos);            oos.writeObject(this);            // 读出二进制流产生的新对象            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());            ObjectInputStream ois = new ObjectInputStream(bis);            return (Cookie) ois.readObject();        } catch (Exception e) {            e.printStackTrace();        }        return null;    }}// ConcretePrototypepublic class SweetCookie extends Cookie {    private static final long serialVersionUID = 1L;    public SweetCookie() {        this.type = "小甜饼";    }}// Clientpublic class CookieMachine {    private Cookie cookie;// cookie必须是可复制的    public CookieMachine(Cookie cookie) {        this.cookie = cookie;    }    public Cookie makeCookie() {        // return cookie.clone();        return cookie.deepClone();    }    public static void main(String args[]) {        List<Cookie> cookies = new LinkedList<Cookie>();        Cookie prototype = new SweetCookie();        CookieMachine cm = new CookieMachine(prototype); // 设置原型        for (int i = 0; i < 5; i++) {            sleep();            Cookie cookieNew = cm.makeCookie();            cookieNew.setCreateTime(new Date());// 设置新时间            // 通过复制原型返回多个cookie            cookies.add(cookieNew);        }        System.out.println(cookies);    }    static void sleep() {        try {            Thread.sleep(200);        } catch (InterruptedException e) {        }    }}


  • 浅复制:

将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。

  • 深复制:
    将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了
    完全彻底的复制,而浅复制不彻底。
  • 0 0
    原创粉丝点击