- 原型模式定义
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
思路
原型模式主要用于对象的复制,核心是一个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;
}
}