您的位置:首页 > 编程语言 > Java开发

JAVA的23种设计模式---原型模式

2017-05-21 10:51 405 查看

概要:

该文章参考了《设计模式之禅》一书及一些前辈的博客文章

1.该文章阐述了原型模式的基础原理及示例代码;

2.该文章适合初学设计模式的技术人员研习;

3.该文章有许多不足之处,请各位大咖指正,喷子绕道;

正文:

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

1.原型模式示例代码实现:

package com.csdn;
/**
* 广告信内容类
* @author Administrator
*
*/
public class AdvTemplate {
//广告信名称
private String advSubject ="CSDN官网活动推广";
//广告信内容
private String advContext = "CSDN官网活动通知:....";
//取得广告信的名称
public String getAdvSubject(){
return this.advSubject;
}
//取得广告信的内容
public String getAdvContext(){
return this.advContext;
}
}


package com.csdn;
/**
* 邮件类
* @author Administrator
*
*/
public class Mail implements Cloneable{
//收件人
private String receiver;
//邮件名称
private String subject;
//称谓
private String appellation;
//邮件内容
private String contxt;
//邮件的尾部,一般都是加上"XXX版权所有"等信息
private String tail;
//构造函数
public Mail(AdvTemplate advTemplate){
this.contxt = advTemplate.getAdvContext();
this.subject = advTemplate.getAdvSubject();
}
//重写克隆方法
@Override
public Mail clone(){
Mail mail =null;
try {
mail = (Mail)super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mail;
}
//以下为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 getAppellation() {
return appellation;
}
public void setAppellation(String appellation) {
this.appellation = appellation;
}
public String getContxt() {
return contxt;
}
public void setContxt(String contxt) {
this.contxt = contxt;
}
public String getTail() {
return tail;
}
public void setTail(String tail) {
this.tail = tail;
}
}


package com.csdn;

import java.util.Random;
/**
* 发送邮件类,实现克隆邮件对象、多线程
* @author Administrator
*
*/
public class SendMail implements Runnable {
@Override
public void run() {
//把模板定义出来,这个是从数据中获得
Mail mail = new Mail(new AdvTemplate());
mail.setTail(".....");
//以下是每封邮件不同的地方,由于克隆的每个邮件对象都是新的实体,无需加锁
Mail cloneMail = mail.clone();
cloneMail.setAppellation(getRandString(5)+" 先生(女士)");
cloneMail.setReceiver(getRandString(5) + "@" + getRandString(8)+".com");
//然后发送邮件
sendMail(cloneMail);
}

//发送邮件
public static void sendMail(Mail mail){
System.out.println("标题:"+mail.getSubject() + "\t" + "收件人:"+mail.
4000
getReceiver() + "\t" + "....发送成功!");
}

//获得指定长度的随机字符串来模拟收件人,实际项目中从数据库读取收件人
public static String getRandString(int maxLength){
String source ="abcdefghijklmnopqrskuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
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 com.csdn;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 模拟群发邮件
* @author Administrator
*
*/
public class Client {
//发送邮件的数量,这个值是从数据库中获得
private static int MAX_COUNT = 10;
public static void main(String[] args) {
//创建定长线程池,指定线程数为5个
ExecutorService service = Executors.newFixedThreadPool(5);
//创建邮件的实体对象
SendMail sMail = new SendMail();
//发送邮件
for(int i = 0 ; i < MAX_COUNT ; i++){
//提交任务
service.submit(sMail);
}
//关闭线程池,之前的任务还是会正常执行结束,但是会拒绝之后的任务
service.shutdown();
}
}


输出:

标题:CSDN官网活动推广   收件人:xwOOP@GuYEizKn.com  ....发送成功!
标题:CSDN官网活动推广   收件人:wokJX@VTBDNKRO.com  ....发送成功!
标题:CSDN官网活动推广   收件人:iMElp@vEsZsIFS.com  ....发送成功!
标题:CSDN官网活动推广   收件人:cKmdU@BSsYyOLQ.com  ....发送成功!
标题:CSDN官网活动推广   收件人:IUilk@qTjyUIQL.com  ....发送成功!
标题:CSDN官网活动推广   收件人:cihOk@oTLHuvVP.com  ....发送成功!
标题:CSDN官网活动推广   收件人:eSfNV@zlFjSVAF.com  ....发送成功!
标题:CSDN官网活动推广   收件人:urCrY@sLugGjNG.com  ....发送成功!
标题:CSDN官网活动推广   收件人:alBBX@jzZvlYxz.com  ....发送成功!
标题:CSDN官网活动推广   收件人:mXSKy@ZvnRxVra.com  ....发送成功!


注:

a:输出内容每次都是不一样的,因为收件人随机

b:对象拷贝时构造函数不会被执行

c:Object提供的clone只拷贝本对象,其他的原始类型都会被拷贝,对其内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址

d:String处理机制比较特殊,使用时可以当做基本类

e:浅度复制与深度克隆

2.通用原型模式模板代码实现:

package com.csdn;

public class PhototypeClass implements Cloneable{
//重写父类Object方法
@Override
public PhototypeClass clone(){
PhototypeClass phototypeClass = null;
try{
phototypeClass = (PhototypeClass)super.clone();
}catch(CloneNotSupportedException e){
//异常处理
}
return phototypeClass;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息