原型模式
1、定义:指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
不需要知道任何创建的细节,不调用构造函数
类型:创建型
2、适用场景
类初始化消耗较多的资源
new 产生的对象需要非常繁琐的过程(数据准备、访问权限等)
构造函数比较复杂
循环体中产生大量对象时
3、优点
原型模式性能比直接 new 一个对象性能高
简化创建过程
4、缺点
必须配备克隆方法
对克隆复杂对象或对克隆出的对象进行复杂改造时,容易引入风险
深拷贝、浅拷贝要运用得当
5、实现
/** * @description * @author: hq * @create: 2022-08-28 14:04 **/ public class Mail implements Cloneable { private String name; private String emailAddress; private String content; private Date birthDate; public Mail() { System.out.println("Mail Class Constructor"); } @Override protected Object clone() throws CloneNotSupportedException { System.out.println("clone"); // 深克隆 // Mail clone = (Mail) super.clone(); // clone.birthDate = (Date) clone.birthDate.clone(); return super.clone(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmailAddress() { return emailAddress; } public void setEmailAddress(String emailAddress) { this.emailAddress = emailAddress; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public Date getBirthDate() { return birthDate; } public void setBirthDate(Date birthDate) { this.birthDate = birthDate; } @Override public String toString() { return "Mail{" + "name='" + name + '\'' + ", emailAddress='" + emailAddress + '\'' + ", content='" + content + '\'' + '}'; } }
/** * @description * @author: hq * @create: 2022-08-28 14:05 **/ public class MailUtil { public static void sendMail(Mail mail) { String outputContent = "向{0}同学,邮件地址:{1},邮件内容:{2}发送邮件成功"; System.out.println(MessageFormat.format(outputContent, mail.getName(), mail.getEmailAddress(), mail.getContent())); } public static void saveOriginMailRecord(Mail mail) { System.out.println("存储 OriginMail 记录,originMail:" + mail.getContent()); } }
/** * @description 原型模式有坑,对于要 clone 的对象中,实现 Cloneable ,默认是浅克隆,如果对象中有引用对象就要注意是否要深克隆 * @author: hq * @create: 2022-08-28 14:09 **/ public class Test { public static void main(String[] args) throws CloneNotSupportedException { Mail mail = new Mail(); mail.setContent("初始化模板"); for (int i = 0; i < 10; i++) { Mail clone = (Mail) mail.clone(); clone.setName("姓名:" + i); clone.setEmailAddress("姓名:" + i + "@qq.com"); clone.setContent("恭喜您,中奖了"); MailUtil.sendMail(clone); } MailUtil.saveOriginMailRecord(mail); } }

浙公网安备 33010602011771号