原型模式定义:使用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。
优点:
1、性能优良。原型模式是在内存二进制流的拷贝,要比直接new一个对象性能好的很多,尤其是在一个循环体内产生大量的对象时。
2、逃避构造函数的约束。
注意:
1、构造函数不会被执行。
2、设计到浅拷贝和深拷贝问题。
3、使用clone时,不要使用final修饰变量。
类图如下:
实现代码如下:
AdvTemplete类:
package com.designpatterns.prototype;
public class AdvTemplete {
private String AdvContext = "XX银行国庆节信用卡抽奖活动";
private String AdvSubject = "国庆节抽奖活动通知:只要刷卡就送你一百万……!";
public String getAdvContext() {
return AdvContext;
}
public String getAdvSubject() {
return AdvSubject;
}
}
Mail类:
package com.designpatterns.prototype;
public class Mail implements Cloneable {
private String receiver;
private String subject;
private String appellation;
private String context;
private String tail;
public Mail(AdvTemplete advTemplete) {
this.context = advTemplete.getAdvContext();
this.subject = advTemplete.getAdvSubject();
}
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
public String getAppellation() {
return appellation;
}
public String getSubject() {
return subject;
}
public String getContext() {
return context;
}
public void setAppellation(String appellation) {
this.appellation = appellation;
}
public String getTail() {
return tail;
}
public void setTail(String tail) {
this.tail = tail;
}
@Override
public Mail clone() {
Mail mail = null;
try {
mail = (Mail) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return mail;
}
}
测试类:
package com.designpatterns.prototype;
import java.util.Random;
public class Client {
private static int MaxCount =6;
public static void main(String[] args) {
Mail mail = new Mail(new AdvTemplete());
mail.setTail("XXX银行版权所有!");
for (int i = 0; i < MaxCount; i++) {
Mail cloneMail = mail.clone();
cloneMail.setReceiver(getRandString(5)+"@"+getRandString(8)+".com");
cloneMail.setAppellation(getRandString(5)+"先生(女士)");
sendMail(cloneMail);
}
}
private static void sendMail(Mail cloneMail) {
System.out.println("标题:"+cloneMail.getSubject()+"\t收件人:"+cloneMail.getReceiver()+"\t...发送成功");
}
private static String getRandString(int i) {
String s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int len = s.length();
Random r =new Random();
StringBuilder sb = new StringBuilder();
for (int j = 0; j < i; j++) {
sb.append(s.charAt(r.nextInt(len)));
}
return sb.toString();
}
}
当创建给定类的实例的过程很昂贵或者很复杂时,就使用原型模式。
原型模式允许你通过复制现有的实例来创建对象。
这就是原型模式。
参考资料:
备注:
转载请注明出处
http://blog.youkuaiyun.com/wsyw126/article/details/50999174
by WSYW126