原型模式
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
package top.fjy8018.designpattern.pattern.creational.prototype.after;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* 原型模式:使用原型实例指定待创建对象的类型,并且通过<strong>复制</strong>这个原型来创建新的对象
|
||||
* 适用于初始化对象复杂的场景
|
||||
* <p>
|
||||
* 邮件
|
||||
*
|
||||
* @author F嘉阳
|
||||
* @date 2018-09-25 20:39
|
||||
*/
|
||||
@Slf4j
|
||||
@Getter
|
||||
@Setter
|
||||
public class AMail implements Cloneable {
|
||||
|
||||
private String name;
|
||||
private String emailAddress;
|
||||
private String content;
|
||||
|
||||
public AMail() throws InterruptedException {
|
||||
// 模拟调用构造器需要复杂过程
|
||||
Thread.sleep(100);
|
||||
log.debug(this.getClass().getSimpleName() + "构造器调用");
|
||||
}
|
||||
|
||||
/**
|
||||
* 带上父类toString方法查看是否为同一个对象
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return "AMail{" +
|
||||
"name='" + name + '\'' +
|
||||
", emailAddress='" + emailAddress + '\'' +
|
||||
", content='" + content + '\'' +
|
||||
'}';
|
||||
}
|
||||
|
||||
/**
|
||||
* 调用克隆函数不需要调用构造器以此加快实例化速度
|
||||
*
|
||||
* @return
|
||||
* @throws CloneNotSupportedException
|
||||
*/
|
||||
@Override
|
||||
public Object clone() throws CloneNotSupportedException {
|
||||
return super.clone();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package top.fjy8018.designpattern.pattern.creational.prototype.after;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
|
||||
/**
|
||||
* 邮件发送类
|
||||
*
|
||||
* @author F嘉阳
|
||||
* @date 2018-09-25 20:42
|
||||
*/
|
||||
@Slf4j
|
||||
public class AMailUtil {
|
||||
public static void sendEmail(AMail mail) {
|
||||
String content = "向{0}同学,邮件地址:{1},邮件内容:{2}发送邮件成功";
|
||||
log.info(MessageFormat.format(content, mail.getName(), mail.getEmailAddress(), mail.getContent()));
|
||||
}
|
||||
|
||||
public static void saveOriginMail(AMail mail) {
|
||||
log.info("存储Mail记录,originMailContent:{}", mail.getContent());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package top.fjy8018.designpattern.pattern.creational.prototype.before;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* 原型模式:使用原型实例指定待创建对象的类型,并且通过<strong>复制</strong>这个原型来创建新的对象
|
||||
* 适用于初始化对象复杂的场景
|
||||
* <p>
|
||||
* 邮件
|
||||
*
|
||||
* @author F嘉阳
|
||||
* @date 2018-09-25 20:39
|
||||
*/
|
||||
@Slf4j
|
||||
@Getter
|
||||
@Setter
|
||||
public class BMail {
|
||||
|
||||
private String name;
|
||||
private String emailAddress;
|
||||
private String content;
|
||||
|
||||
public BMail() throws InterruptedException {
|
||||
// 模拟调用构造器需要复杂过程
|
||||
Thread.sleep(100);
|
||||
log.debug(this.getClass().getSimpleName() + "构造器调用");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "AMail{" +
|
||||
"name='" + name + '\'' +
|
||||
", emailAddress='" + emailAddress + '\'' +
|
||||
", content='" + content + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package top.fjy8018.designpattern.pattern.creational.prototype.before;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import top.fjy8018.designpattern.pattern.creational.prototype.before.BMail;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
|
||||
/**
|
||||
* 邮件发送类
|
||||
*
|
||||
* @author F嘉阳
|
||||
* @date 2018-09-25 20:42
|
||||
*/
|
||||
@Slf4j
|
||||
public class BMailUtil {
|
||||
public static void sendEmail(BMail mail) {
|
||||
String content = "向{0}同学,邮件地址:{1},邮件内容:{2}发送邮件成功";
|
||||
log.info(MessageFormat.format(content, mail.getName(), mail.getEmailAddress(), mail.getContent()));
|
||||
}
|
||||
|
||||
public static void saveOriginMail(BMail mail) {
|
||||
log.info("存储Mail记录,originMailContent:{}", mail.getContent());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
package top.fjy8018.designpattern.pattern.creational.prototype.before;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import top.fjy8018.designpattern.pattern.creational.prototype.after.AMail;
|
||||
import top.fjy8018.designpattern.pattern.creational.prototype.after.AMailUtil;
|
||||
|
||||
@Slf4j
|
||||
class BMailTest {
|
||||
|
||||
private long start;
|
||||
|
||||
@BeforeEach
|
||||
void init() {
|
||||
start = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
void destory() {
|
||||
log.debug("耗时{}ms", System.currentTimeMillis() - start);
|
||||
}
|
||||
|
||||
/**
|
||||
* 每次实例化对象,耗时长——耗时613ms
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
@Test
|
||||
void before() throws Exception {
|
||||
BMail mail = new BMail();
|
||||
mail.setContent("原始正文");
|
||||
for (int i = 0; i < 5; i++) {
|
||||
// 初始化临时发送邮件对象,防止原始正文被最后一个对象覆盖
|
||||
BMail tempMail = new BMail();
|
||||
tempMail.setName("学员" + i);
|
||||
tempMail.setContent("正文" + i);
|
||||
tempMail.setEmailAddress("地址" + i);
|
||||
BMailUtil.sendEmail(tempMail);
|
||||
}
|
||||
// 本意希望在发送完所有邮件后保存开始的正文
|
||||
BMailUtil.saveOriginMail(mail);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 调用克隆方法(浅拷贝,因为没有对每个属性实现克隆方法),显然速度更快——耗时110ms
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
@Test
|
||||
void after() throws Exception {
|
||||
AMail mail = new AMail();
|
||||
mail.setContent("原始正文");
|
||||
// 通过hashCode查看是否为同一个对象
|
||||
log.debug(Integer.toHexString(mail.hashCode()));
|
||||
for (int i = 0; i < 5; i++) {
|
||||
// 初始化临时发送邮件对象,防止原始正文被最后一个对象覆盖
|
||||
AMail tempMail = (AMail) mail.clone();
|
||||
tempMail.setName("学员" + i);
|
||||
tempMail.setContent("正文" + i);
|
||||
tempMail.setEmailAddress("地址" + i);
|
||||
AMailUtil.sendEmail(tempMail);
|
||||
log.debug(Integer.toHexString(tempMail.hashCode()));
|
||||
}
|
||||
// 本意希望在发送完所有邮件后保存开始的正文
|
||||
AMailUtil.saveOriginMail(mail);
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user