脚本宝典收集整理的这篇文章主要介绍了秒懂设计模式之原型模式(Prototype Pattern),脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
[版权申明] 非商业目的注明出处可自由转载 出自:shusheng007
设计模式汇总篇,一定要收藏:永不磨灭的设计模式
原型模式属于创建型模式,所以它是描述如何创建对象的模式。顾名思义,先搞一个原型对象出来,然后在这个原型对象的基础上修修补补再弄出一个新对象来。
我们一定要牢记设计模式是前人总结的一套可以有效解决问题的经验,不要一写代码就在考虑该使用什么设计模式,这是极其不可取的。正确的做法应该是在实现业务需求的同时,尽量遵守面向对象设计的六大设计原则即可。后期随着业务的扩展,你的代码会不断的演化和重构,在此过程中设计模式绝逼会大放异彩的。
创建型(creational)
2颗星
使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。
你看看这定义,就是不说人话!不管它,一会通过实例意会一下,再通过使用场景知道解决什么问题就可以了
照例上一张手撕UML类图
UML 类图也比较简单,只有两个部分这个是一个接口,里面必须含有一个可以克隆自己的方法。在Java中,我们可以使用JDK自带的java.lang.Cloneable
接口来替代此接口
实现了Prototype
接口的原型对象,这个对象有个能力就是可以克隆自己。
上回我们说到王二狗公司的大老板要看商城项目的周报表,二狗他们在开发中发现,批量导出报表时特别慢。经过调查发现是报表的主体部分特别耗时,那些头部,作者什么的都不怎么耗时。那二狗他们就在想,能不能将那些耗时的操作作为原型对象,然后在这个原型对象上添加上其他部分,对头,用原型模式可解。
假设一篇报表由报表头与报表体组成,报表体获取特别耗时,报表头不耗时,我们如何大量导出报表呢?
原型接口必须有一个可以克隆自己的方法,反回类型为Prototype
public interface Prototype {
Prototype copy();
}
这个类就是我们的原型类,准备被其他人克隆使用的,所以其实现Prototype
接口,具备克隆的能力。根据业务需求,克隆可以是浅克隆,也可以是深克隆。
我们假设此类含有一个存放内容的List
,这些数据都是从数据库读取的相对比较耗时。假设我们要生成多篇不同报表,内容基本不变(这是要点,只有你需要的对象是可以基于原型对象的才有意义),头部要不同。
public class Report implements Prototype {
private List<String> parts;
public Report() {
this.parts = new ArrayList<>();
}
public Report(List<String> parts) {
this.parts = parts;
}
//耗时的数据加载操作
public void loadData() {
pats.clear();
parts.add("老夫聊发少年狂,左牵黄,右擎苍,锦帽貂裘,千骑卷平冈。");
parts.add("为报倾城随太守,亲射虎,看孙郎。");
parts.add("酒酣胸胆尚开张,鬓微霜,又何妨!持节云中,何日遣冯唐?");
parts.add("会挽雕弓如满月,西北望,射天狼。");
}
public List<String> getContents() {
return parts;
}
@Override
public Prototype copy() {
List<String> cloneList = new ArrayList<>(parts);
return new Report(cloneList);
}
}
public class PrototypeClient {
public void getReport(){
//创建原型
Report reportPrototype = new Report();
//耗费资源的操作
reportPrototype.loadData();
//使用原型对象构建新的对象
Report reportWithTitle = (Report) reportPrototype.copy();
List<String> reportContent= reportWithTitle.getContents();
reportContent.add(0,"《江城子·密州出猎》");
reportContent.add(1,"----------------------------------------------------------");
for (String s : reportContent) {
System.out.println(s);
}
}
}
输出
《江城子·密州出猎》
--------------------------------------------------------------------------------
老夫聊发少年狂,左牵黄,右擎苍,锦帽貂裘,千骑卷平冈。
为报倾城随太守,亲射虎,看孙郎。
酒酣胸胆尚开张,鬓微霜,又何妨!持节云中,何日遣冯唐?
会挽雕弓如满月,西北望,射天狼。
Prototype
有时会极大的提升程序的性能。
相对增加了系统的复杂性。
设计模式值得你刻意练习!
GitHub源码地址:design-patterns
以上是脚本宝典为你收集整理的秒懂设计模式之原型模式(Prototype Pattern)全部内容,希望文章能够帮你解决秒懂设计模式之原型模式(Prototype Pattern)所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。