设计模式-原型模式

设计模式-原型模式

用原型实例指定创建对象的种类,通过拷贝这些原型创建新的对象。

电子账单

即,使用电子账单

// 广告信模板
public class AdvTemplate {
	// 广告信名称
	private String advSubject = "XX活动";
	// 广告内容
	private String advContext = "XX活动";
	// 取得广告名称
	public String getAdvSubject(){
		return this.advSubject;
	}
	// 取得广告信内容
	public String getAdvContext(){
		return this.advContext;
	}
}
// 邮件
public class Mail {
	// 收件人
	private String receiver;
	// 邮件名称
	private String subject;
	// 称谓
	private String appellation;
	// 邮件内容
	private String contxt;
	// 邮件尾部
	private String tail;
	// 构造函数
	public Mail(AdvTemplate advTemplate){
		this.contxt = advTemplate.getAdvContext();
		this.subject = advTemplat.getAdvSubject()
	}
	// get set方法
	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 getApplation(){
		return applation;
	}
	public void setApplation(String applation){
		this.appellation = applation
	}
	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;
	}
}

最后绘制场景

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("  ");
		while(i < MAX_COUNT){
			mail.setAppllation(getRandString(5) + "先生(女士)");
			mail.setReceiver(getRandString(5) + "@" + mail.getRandString() + ".com");
			// 发送邮件
			sendMail(mail);
			i++;
		}
	}
	// 发送邮件
	public static void sendMail(Mail mail){
		System.out.println("标题" + mail.getSubject() + "发送成功");
	}
	// 获取指定长度的随机字符串
	public static String getRandString(int maxLength){
		String source = "abcdefghijklmnopqrstuvwxyz";
		// 缓冲区
		StringBuffer sb = new StringBuffer();
		// 随机数
		Random rand = new Random();
		// 进行循环
		for(int i = 0; i < maxLength; i++){
			// 进行随机取字符数
			sb.append(source.charAt(rand.nextlnt(source.length())));	// rand.nextInt()	生成伪随机数,放入到缓冲区内
		}
		return sb.toString();	// 返回生成的伪字符串
	}
}

使用多线程改进

由于是一个线程发送邮件过慢,使用多线程解决问题。

增加一个Cloneable接口

关于克隆

克隆用途

关于Cloneable 接口,用途和Serializable一样为标记型接口,内部没有方法和属性,implements Cloneable 表示对象能被克隆,即能使用Object.clone()方法,

关于深浅拷贝

这个已经重复多次了。。。。。。。。。再js里已经重复了一次

浅拷贝,只单单拷贝本身,不拷贝引用。

深拷贝,完整的递归拷贝。

修改后的代码

public class Mail implements Cloneable {	// 继承自java本身就有的空接口,即Cloneable
	// 收件人
	private String receiver;
	// 邮件名称
	private String subject;
	// 称谓
	private String appellation;
	// 邮件内容
	private String contxt;
	// 邮件尾部
	private String tail;
	// 构造函数
	public Mail(AdvTemplate advTemplate){
		this.contxt = advTemplate.getAdvContext();
		this.subject = advTemplat.getAdvSubject()
	}
	// 下面进行浅拷贝,重写clone方法
	@Override
	public Mail clone(){
		Mail mail = null;
		try{
			mail = (Mail)super.clone();
		}catch(CloneNotSupportedException e){
			e.printStackTrace();
		}
		return mail;
	}
	// get set方法
	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 getApplation(){
		return applation;
	}
	public void setApplation(String applation){
		this.appellation = applation
	}
	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;
	}
}

然后修改场景类

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("  ");
		while(i < MAX_COUNT){
			Mail cloneMail = mail.clone();
			cloneMail.setAppllation(getRandString(5) + "先生(女士)");
			cloneMail.setReceiver(getRandString(5) + "@" + mail.getRandString() + ".com");
			// 发送邮件
			sendMail(cloneMail );
			i++;
		}
	}
	// 发送邮件
	public static void sendMail(Mail mail){
		System.out.println("标题" + mail.getSubject() + "发送成功");
	}
	// 获取指定长度的随机字符串
	public static String getRandString(int maxLength){
		String source = "abcdefghijklmnopqrstuvwxyz";
		// 缓冲区
		StringBuffer sb = new StringBuffer();
		// 随机数
		Random rand = new Random();
		// 进行循环
		for(int i = 0; i < maxLength; i++){
			// 进行随机取字符数
			sb.append(source.charAt(rand.nextlnt(source.length())));	// rand.nextInt()	生成伪随机数,放入到缓冲区内
		}
		return sb.toString();	// 返回生成的伪字符串
	}
}

使用拷贝,将sendMail放入线程池里,每次拷贝一个对象,然后将对象放入sendMail,然后将sendMail放入线程里,每次运行一个线程,拷贝一个对象,这样解决,一个线程还未发送完成邮件的时候,就传入的对象被修改的问题。

最后 深拷贝

实现深拷贝

在clone内部,将该对象引用的对象,再次进行拷贝即可。

应用

打飞机游戏中,主飞机,使用单例模式,其余飞机,使用原型模式,以一架飞机为原型,生成多个飞机。后者使用深拷贝。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏软件开发 -- 分享 互助 成长

原型模式C++类的复制构造函数和赋值运算符

一、简介 1、原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 2、为什么会用到原型模式? (1)既然可以直接new,为什么会用到原型...

26850
来自专栏项勇

笔记45 | 代码性能优化建议[转]

14860
来自专栏前端达人

JavaScript基础——Promise使用指南

在上篇文章里《JavaScript基础——回调(callback)是什么》我们一起学习了回调,明白了回调就是一个在另外一个函数执行完后要执行的函数,如果我们希望...

29830
来自专栏Petrichor的专栏

tensorflow编程: Building Graphs

每次都必须要指定一个graph作为as_default,并只能在该graph中进行一切操作。

16630
来自专栏java一日一条

在Java中如何避免“!=null”式的判空语句?

我整天都是在跟Java打交道。我在Java开发中最常用的一段代码就是用object != null在使用对象之前判断是否为空。这么做是为了避免NullPoint...

33410
来自专栏java一日一条

在Java中如何避免“!=null”式的判空语句?

我整天都是在跟Java打交道。我在Java开发中最常用的一段代码就是用object != null在使用对象之前判断是否为空。这么做是为了避免NullPoint...

11110
来自专栏FreeBuf

CTF小技巧:文本解密工具 Text Decoder Toolkit

欢迎来到文本解码挑战赛! T{4 G=C 9<=E B63 3<3;G /<2 9<=E G=C@A3:4^ G=C <332 <=B 43/@ B63 @3A...

305100
来自专栏为数不多的Android技巧

ART深度探索开篇:从Method Hook谈起

Android上的热修复框架 AndFix 想必已经是耳熟能详,它的原理实际上很简单:方法替换——Java层的每一个方法在虚拟机实现里面都对应着一个ArtMet...

24910
来自专栏诸葛青云的专栏

学了指针没学动态内存一切都白搭!C语言基础教程之内存管理

本文将讲解 C 中的动态内存管理。C 语言为内存的分配和管理提供了几个函数。这些函数可以在<stdlib.h>头文件中找到。

12800
来自专栏Java学习网

Java面试题系列之基础部分(六)——每天学5个问题

Java基础部分学习的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法,这些都是最基...

27150

扫码关注云+社区

领取腾讯云代金券