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; } }
相关文章推荐
- java23种设计模式-----原型模式
- 走穿java23种设计模式-5原型模式
- Java的23种设计模式----原型模式
- Java开发中的23种设计模式详解----原型模式
- java23种设计模式--原型模式(prototype)
- java 23种设计模式 05 原型模式
- Java 23种设计模式之原型模式
- java23种设计模式之原型模式(Prototype)
- 23种设计模式(3) java原型模式
- JAVA开发的23种设计模式之 --- 原型模式
- Java开发中的23种设计模式之五:原型模式(Prototype)
- Java23种设计模式——原型模式
- 走穿java23种设计模式-5原型模式
- 【创建型模式】原型模式(Prototype)之23种java设计模式
- java 23种常用设计模式之原型模式(Prototype)
- java23种设计模式之原型模式(Prototype)
- 重学java23种设计模式(4)原型模式
- java关于23种设计模式的有趣见解
- JAVA23种设计模式的代码
- [转]追MM与Java的23种设计模式