设计模式-原型模式
一、定义
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
二、类型
创建型
三、适用场景
- 资源优化,初始化类需要消耗非常多的资源,资源包括数据、硬件等。
- 性能和安全要求场景,通过new产生一个对象需要非常繁琐的数据准备或访问权限。
- 一个对象多个修改者的场景,一个对象提供给其他对象访问,而且各个调用者都可能修改这个对象的值是,可以考虑使用原型模式拷贝多个对象供调用者使用。
四、优点
- 原型模式是在内存中进行二进制流的拷贝,要比new一个对象性能好很多,特别是在循环体里要创建大量的对象时。
- 逃避构造函数的约束,直接在内存中拷贝,构造函数是不会执行的,这既是缺点又是优点,需要考虑实际应用场景。
五、缺点
- 必须实现Cloneable接口,并重写Object类的clone()方法。
- 克隆容易出现风险,深拷贝和浅拷贝要特别注意。
六、类图
七、代码实现
要实例化的类:
package com.wms.createtype.prototype;
public class Mail implements Cloneable {
private String subject;
private String receiver;
private String content;
public Mail(MailTemplate mailTemplate) {
this.subject = mailTemplate.getSubject();
this.content = mailTemplate.getContent();
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public void sendEmai() {
System.out.println("主题:" + this.subject + ",收件人:" + this.receiver + ",内容:" + this.content);
}
@Override
protected Mail clone() throws CloneNotSupportedException {
return (Mail) super.clone();
}
}
模板类,在这个例子中辅助作用:
package com.wms.createtype.prototype;
public class MailTemplate {
private String subject;
private String content;
public MailTemplate(String subject, String content) {
this.subject = subject;
this.content = content;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
测试类:
package com.wms.createtype.prototype;
public class TestDesignPattern {
public static void main(String[] args) throws CloneNotSupportedException {
Mail mail = new Mail(new MailTemplate("this is subject", "this is content"));
for (int i = 0; i < 10; i++) {
Mail tempMail = mail.clone();
tempMail.setReceiver("receiver" + i);
tempMail.sendEmai();
}
}
}