原型模式:就是不用通过new来产生对象,而是通过克隆来产生新的对象。
下面主要是通过电子账单例子来介绍:
第一是没有用原型模式实现的:记得我是一个类一个类的代码复制上去的。
package patten.prototyprPattern;
public class AdvTemplate {
//广告信的名称
private String advSubject = "xx银行国庆信用卡抽奖活动";
//广告信的内容
private String advContext = "国庆抽奖活动通知:只要刷卡就送你100万,,";
//取得广告信的名称
public String getAdvSubject() {
return advSubject;
}
//取得广告信的内容
public String getAdvContext() {
return advContext;
}
}
package patten.prototyprPattern;
public class Mail {
//收件人
private String receiver;
//邮件名称
private String subject;
//称谓
private String application;
//邮件的内容
private String context;
//邮件尾部
private String tail;
//构造函数
public Mail(AdvTemplate advTemplate){
this.context = advTemplate.getAdvContext();
this.subject = advTemplate.getAdvSubject();
}
//以下是getter和setter方法
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 getApplication() {
return application;
}
public void setApplication(String application) {
this.application = application;
}
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;
}
}
package patten.prototyprPattern;
import java.util.Random;
public class Client {
//发送账单的数量是数据库提取的
private static int MAX_COUNT = 6;
public static void main(String[] args) {
//模拟发邮件
int i = 0;
//将模板定义出来,这是从数据库中获取的
Mail mail = new Mail(new AdvTemplate());
mail.setTail("xx银行版权所有");
while(i < MAX_COUNT){
//以下是每封邮件的不同地方
mail.setApplication(getRandString(5)+"先生(女生)");
mail.setReceiver(getRandString(5)+"@"+getRandString(8)+".com");
//然后发送邮件
sendMail(mail);
i++;
}
}
//发送邮件
public static void sendMail(Mail mail){
System.out.println("标题:"+mail.getSubject()+" 收件人:"+mail.getReceiver()+" ...发送成功!");
}
//获取指定长度的随机字符
public static String getRandString(int maxLength){
String source = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
StringBuffer sb = new StringBuffer();
Random rand = new Random();
for(int i = 0;i<maxLength ;i++){
sb.append(source.charAt(rand.nextInt(source.length())));
}
return sb.toString();
}
}
下面是用原型模式来实现的:你们可以对比一下:大字的是变化的
package patten.prototyprPattern2;
public class AdvTemplate {
//广告信的名称
private String advSubject = "xx银行国庆信用卡抽奖活动";
//广告信的内容
private String advContext = "国庆抽奖活动通知:只要刷卡就送你100万,,";
//取得广告信的名称
public String getAdvSubject() {
return advSubject;
}
//取得广告信的内容
public String getAdvContext() {
return advContext;
}
}
package patten.prototyprPattern2;
public class Mail implements Cloneable{
//收件人
private String receiver;
//邮件名称
private String subject;
//称谓
private String application;
//邮件的内容
private String context;
//邮件尾部
private String tail;
//修改后的邮件类
@Override
public Mail clone(){
Mail mail = null;
try{
mail = (Mail)super.clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
return mail;
}
//构造函数
public Mail(AdvTemplate advTemplate){
this.context = advTemplate.getAdvContext();
this.subject = advTemplate.getAdvSubject();
}
//以下是getter和setter方法
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 getApplication() {
return application;
}
public void setApplication(String application) {
this.application = application;
}
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;
}
}
package patten.prototyprPattern2;
import java.util.Random;
public class Client {
//发送账单的数量是数据库提取的
private static int MAX_COUNT = 6;
public static void main(String[] args) {
//模拟发邮件
int i = 0;
//将模板定义出来,这是从数据库中获取的
Mail mail = new Mail(new AdvTemplate());
mail.setTail("xx银行版权所有");
while(i < MAX_COUNT){
//以下是每封邮件的不同地方
Mail cloneMail = mail.clone();
cloneMail.setApplication(getRandString(5)+"先生(女生)");
cloneMail.setReceiver(getRandString(5)+"@"+getRandString(8)+".com");
//然后发送邮件
sendMail(cloneMail);
i++;
}
}
//发送邮件
public static void sendMail(Mail mail){
System.out.println("标题:"+mail.getSubject()+" 收件人:"+mail.getReceiver()+" ...发送成功!");
}
//获取指定长度的随机字符
public static String getRandString(int maxLength){
String source = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
StringBuffer sb = new StringBuffer();
Random rand = new Random();
for(int i = 0;i<maxLength ;i++){
sb.append(source.charAt(rand.nextInt(source.length())));
}
return sb.toString();
}
}