設計模式 -- 原型模式

來源:互聯網
上載者:User

標籤:style   blog   http   java   color   strong   io   width   

概述                                                                                           

用原型執行個體指定建立對象的種類,並且通過拷貝這些原型建立新的對象。

原型模式屬於對象的建立模式。通過給出一個原型對象來指明所有建立的對象的類型,然後用複製這個原型對象的辦法建立出更多同類型的對象。這就是選型模式的用意。

原型模式要求對象實現一個可以“複製”自身的介面,這樣就可以通過複製一個執行個體對象本身來建立一個新的執行個體。這樣一來,通過原型執行個體建立新的對象,就不再需要關心這個執行個體本身的類型,只要實現了複製自身的方法,就可以通過這個方法來擷取新的對象,而無須再去通過new來建立。

類圖                                                                                          

代碼                                                                                         

以通過群發郵件的例子說明一下:

public class Mail implements Cloneable {    private String receiver;    private String subject;    private String appellation;    private String contxt;    private String tail;    public Mail(String subject, String contxt) {        super();        this.subject = subject;        this.contxt = contxt;    }        public String getReceiver() {        return receiver;    }    public void setReceiver(String receiver) {        this.receiver = receiver;    }    public String getAppellation() {        return appellation;    }    public void setAppellation(String appellation) {        this.appellation = appellation;    }    public String getTail() {        return tail;    }    public void setTail(String tail) {        this.tail = tail;    }    public String getSubject() {        return subject;    }    public String getContxt() {        return contxt;    }    public Mail clone() {        Mail mail = null;        try {            mail = (Mail) super.clone();        } catch (CloneNotSupportedException e) {            // TODO 自動產生的 catch 塊            e.printStackTrace();        }        return mail;    }    }
public class ClientDemo {    private static int MAX_COUNT = 6;    public static void main(String[] args)    {        int i =0;        Mail mail = new Mail("群發標題","群發內容");        mail.setTail("群髮結尾");        Random rand = new Random();        while(i < MAX_COUNT)        {            Mail cloneMail = mail.clone();            cloneMail.setAppellation("尊稱"+rand.nextInt(100)+":");            cloneMail.setReceiver(rand.nextInt(1000000000)+"@qq.com");            sendMail(cloneMail);            i++;        }    }        public static void sendMail(Mail mail)    {        System.out.println("標題:"+mail.getSubject()+"\t收件者:"+mail.getReceiver()+"\t.....發送成功");    }}

複製必須滿足的條件                                                                      

a.對任何的對象x,都有:x.clone() != x,即複製對象與原對象不是同一個對象。

b.對任何的對象x,都有:x.clone().getClass() == x.get getClass(),即複製對象與原對象的類型是一樣的。

c.如果對象x的equals()方法定義恰當的話,那麼x.clone().equals(x)應當是成立的。

淺複製:複製了實值型別對象,對於參考型別對象,只複製了引用,它指向原來引用的對象。Java中clone為淺複製。

深複製:對實值型別和參考型別的對象都產生一份新的拷貝. Java中可以通過序列化來進行深複製,前提是對象以及對象內部所引用的對象都是可序列化的,否則需要考慮將那些不可序列化的對象可否設為transient,排除在複製過程之外。

我是天王蓋地虎的分割線                                                                 

原始碼:http://pan.baidu.com/s/1dD1Qx01

java原型.zip

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.