1. 程式人生 > >設計模式——原型模式

設計模式——原型模式

rri 模板 post set main receive 簽名 supported RR

  • 原型模式定義
    用原型實例指定創建對象的種類,並通過拷貝這些原型創建新的對象。
  • 思路
    原型模式主要用於對象的復制,核心是一個clone方法,通過該方法驚喜對象的拷貝,Java提供了Cloneable接口來標記對象可拷貝。有可能被拷貝->可以被拷貝,實現方法是覆蓋clone()方法。

  • 對應需求
    超級商城每次商品狀態變更,都需要以郵件形式發送變更消息給對應產品和運營人員,其中更改的信息只有商品名稱,商品URL,商品狀態,其余均為不更改模板,這時候如果能夠使用模板模式將會省去很多代碼。

  • 原型模式UML圖
    技術分享圖片

    /**
 * Created by jianw.li on 2017/12/12.
 * 原型模式
 */
public class Client {

    private static final Random random = new Random();

    public static void main(String[] args) {
        Mail mail = new Mail(new MailTemplate());
        mail.setTail("張三|機票事業部|西小口");
        for (int i = 0; i < 5; i++) {
            Mail cloneMail = mail.clone();
            cloneMail.setName(String.valueOf(random.nextInt(100)));
            cloneMail.setName(String.valueOf(random.nextInt(100)) + ".com");
            //發送郵件
        }
    }
}
    /**
 * Created by jianw.li on 2017/12/13.
 * 郵件類
 */
public class Mail {

    /**
     * 收件人
     */
    private String receiver;

    /**
     * 郵件標題
     */
    private String subject;

    /**
     * 發送人
     */
    private String name;

    /**
     * 郵件內容
     */
    private String context;

    /**
     * 郵件簽名
     */
    private String tail;

    public Mail(MailTemplate mailTemplate) {
        this.subject = mailTemplate.getMailSubject();
        this.context = mailTemplate.getMailContent();
    }

    @Override
    public Mail clone() {
        Mail mail = null;
        try {
            mail = (Mail) super.clone();
        } catch (CloneNotSupportedException e) {
            //日誌
        }
        return mail;
    }

    public String getReceiver() {
        return receiver;
    }

    public void setReceiver(String receiver) {
        this.receiver = receiver;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getName() {
        return name;
    }

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

    public String getContext() {
        return context;
    }

    public void setContext(String context) {
        this.context = context;
    }

    public String getTail() {
        return tail;
    }

    public void setTail(String tail) {
        this.tail = tail;
    }
}
    public class MailTemplate {

    /**
     * 郵件標題
     */
    private String mailSubject = "超級商城商品價格變更";

    private String mailContent = "xxx商品價格變更";

    public String getMailSubject() {
        return mailSubject;
    }

    public String getMailContent() {
        return mailContent;
    }
}

設計模式——原型模式