原型模式
原型模式:就是不用通过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()+"\t收件人:"+mail.getReceiver()+"\t...发送成功!"); } //获取指定长度的随机字符 public static String getRandString(int maxLength){ String source = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"; StringBuffer sb = new StringBuffer(); Random rand = new Random(); for(int i = 0;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()+"\t收件人:"+mail.getReceiver()+"\t...发送成功!"); } //获取指定长度的随机字符 public static String getRandString(int maxLength){ String source = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"; StringBuffer sb = new StringBuffer(); Random rand = new Random(); for(int i = 0;i){ sb.append(source.charAt(rand.nextInt(source.length()))); } return sb.toString(); } }