莱芜58同城,网站代码优化方法,淄博网站制作怎么收费,如何去除wordpress登录页面图标1.原型模式定义 用一个已经创建的实例作为原型#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象#xff1b;
1.1 原型模式优缺点
优点
当创建一个新的对象实例较为复杂时#xff0c;使用原型模式可以简化对象的创建过程#xff0c;通过复制一个已有的实例…1.原型模式定义 用一个已经创建的实例作为原型通过复制该原型对象来创建一个和原型对象相同的新对象
1.1 原型模式优缺点
优点
当创建一个新的对象实例较为复杂时使用原型模式可以简化对象的创建过程通过复制一个已有的实例可以提高新实例的创建效率相较比工程模式原型模式提供了简化的创建结构无需专门的工厂类来创建产品可以使用深克隆的方式保存对象状态辅助实现撤销操作
缺点
需要为每个类配备一个克隆方法而且这个克隆方法位于一个类的内部对已有的类改造时需要修改源代码违反了开闭原则
1.2 原型模式适用场景 创建对象的成本比较大比如对象中的数据是经过复杂计算或者需要从数据库得到这种情况就可以使用原型模式从其他已有的对象中进行拷贝而不是每次都创建新的对象
资源优化场景如当进行对象初始化需要很多外部资源IO资源、数据文件、CPU、网络、内存等复杂的依赖场景如A对象的创建依赖BB依赖CC依赖D。。。性能和安全要求的场景如同一个用户在一个会话周期里可能会反复登录平台或使用某些受限的功能每一次访问请求都会访问授权服务器进行授权但如果每次都通过 new 产生一个对象会非常烦琐这时则可以使用原型模式同一个对象可能被多个修改者使用的场景需要保存原始状态的场景如记录历史操作的场景
2.原型模式原理 原型模式核心就是通过克隆复制一个对象
抽象原型类Prototype声明克隆方法的接口类是所有具体原型类的公共父类它可以是抽象类也可以是接口具体原型类ConcretePrototype实现在抽象原型类中声明的克隆方法在克隆方法中返回自己的一个克隆对象客户类Client在客户类中使一个原型对象克隆自身从而创建一个新的对象由于客户类针对抽象原型类编程因此用户可以根据需要选择具体原型类系统具有较好的扩展性增加或者替换原型类都比较方便 2.1 深克隆与浅克隆
深克隆完全创建一个新对象且新对象的变量同原型一致二者互不影响浅克隆新对象的变量同原型一致且新对象的引用仍然指向原型对象二者共享同一对象 Java 中的 Object 类的 clone() 方法就是浅克隆如下面常用的BeanUtils用到了浅克隆
BeanUtils.cloneBean(Object obj); 对象序列化之后再进行反序列化获取到的就是不同对象这就是深克隆
SerializationUtils.clone(T object);
3.原型模式实现
【实例】 如一个广告邮件的发送大部分信息都是用的模板是相同的只有收件人等不同如果每发送一个邮件就创建一个邮件对象比较浪费这就可以用到原型模式
【代码】 首先实体类中重写clone()方法
Data
public class Mail implements Cloneable{//收件人private String receiver;//邮件名称private String subject;//称谓private String appellation;//邮件内容private String context;//构造函数public Mail(AdvTemplate advTemplate) {this.context advTemplate.getAdvContext();this.subject advTemplate.getAdvSubject();}Overridepublic Mail clone(){Mail mail null;try {mail (Mail)super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return mail;}
} 然后即可克隆该对象
//模拟邮件发送
int i 0;//把模板定义出来,数据是从数据库获取的
Mail mail new Mail(new AdvTemplate());
mail.setTail(xxx银行版权所有);
while(i MAX_COUNT){//下面是每封邮件不同的地方Mail cloneMail mail.clone();cloneMail.setAppellation( 先生 (女士));Random random new Random();int num random.nextInt(9999999);cloneMail.setReceiver(numliuliuqiu.com);//发送 邮件sendMail(cloneMail);i;
}