設計模式學習(四) 原型模型

來源:互聯網
上載者:User

標籤:

使用情境

-- 通過new產生一個對象需要非常繁瑣的資料準備或存取權限,則可以使用原型模式

-- 就是java中的複製技術,以某個對象為原型複製出新的對象 ,顯然,新的對象具備原型對象的特點

優勢:

效率高(直接複製,避免了重新執行構造的過程步驟)。

複製類似於new,但是不同於new。new建立新的對象屬性採用的是預設值。複製出的對象的屬性值完全和原型對象相同,並且複製出的新對象改變不會影響原型對象。然後,再修改複製對象的值

 

原型模式實現:

  -- Cloneable介面和clone方法

  -- ProtoType模式中實現起來最困難的地方就是記憶體複製操作,所幸在java中提供了clone方法替我們做的絕大部分事情

 

淺複製代碼:

package com.lp.prototype;import java.util.Date;public class Sheep implements Cloneable {    private String name;    private Date birthday;        @Override    protected Object clone() throws CloneNotSupportedException {        Object obj = super.clone();//直接調用Object的clone方法            return obj;    }    public Sheep(String name, Date birthday) {        super();        this.name = name;        this.birthday = birthday;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Date getBirthday() {        return birthday;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }        Sheep(){            }        }
sheep類
package com.lp.prototype;import java.util.Date;public class Client {    public static void main(String[] args) throws Exception{        Date date = new Date(1861381234L);        Sheep s1 = new Sheep("多利",date);        Sheep s2 = (Sheep)s1.clone();                date.setTime(23456789L);        s1.setBirthday(date);                s1.setName("少利");        System.out.println(s1.getName());        System.out.println(s1.getBirthday());        System.out.println(s1);                System.out.println(s2.getName());        System.out.println(s2.getBirthday());        System.out.println(s2);        //這裡s1 和s2 的對象不同 但是值是一樣的        //淺複製只複製一個對象的實值型別資料和引用的地址           // 所以他們兩個的date對象指的是同一個對象  故而只要修改其中的一個的值 另外一個還會發生變化    }}
Client

 結果:

這裡修改了日期對象  ,他們兩個的值都變化了  可見複製的不是對象的全部參考型別只是複製了引用而不是對象。

 

深複製代碼:

package com.lp.prototype;import java.util.Date;public class Sheep implements Cloneable {    private String name;    private Date birthday;        @Override    protected Object clone() throws CloneNotSupportedException {        Object obj = super.clone();//直接調用Object的clone方法                //添加如下代碼實現深複製        Sheep s = (Sheep)obj;        s.birthday= (Date)this.birthday.clone();                        return obj;    }    public Sheep(String name, Date birthday) {        super();        this.name = name;        this.birthday = birthday;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Date getBirthday() {        return birthday;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }        Sheep(){            }        }
sheep
package com.lp.prototype;import java.util.Date;public class Client {    public static void main(String[] args) throws Exception{        Date date = new Date(1861381234L);        Sheep s1 = new Sheep("多利",date);        Sheep s2 = (Sheep)s1.clone();                date.setTime(23456789L);        s1.setBirthday(date);                s1.setName("少利");        System.out.println(s1.getName());        System.out.println(s1.getBirthday());        System.out.println(s1);                System.out.println(s2.getName());        System.out.println(s2.getBirthday());        System.out.println(s2);        //這裡s1 和s2 的對象不同 但是值是一樣的        //淺複製只複製一個對象的實值型別資料和引用的地址           // 所以他們兩個的date對象指的是同一個對象  故而只要修改其中的一個的值 另外一個還會發生變化    }}
client

結果:

這樣就可以實現深複製了

 

設計模式學習(四) 原型模型

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.