引入概念:
原型模式:实例通过copy创建新的对象,有浅copy和深copy.
项目中,由于menu中的对象,被popupwindow引用,popupwindow的点击事件又会对,对象属性进行修改,
解决办法就是,创建临时的新对象给 popupwindow用,
于是产生了下面很不优雅的代码,
NavMenuDetailEntity temp = new NavMenuDetailEntity();
temp.setNavMenuDetailTitle(forGetUI.getNavMenuDetailTitle()); temp.setNavMenuDetailDesc(forGetUI.getNavMenuDetailDesc());
temp.setNavMenuDetailList(forGetUI.getNavMenuDetailList());
temp.setNavMenuDetailIcon(forGetUI.getNavMenuDetailIcon());
temp.setNavMenuDetailColor(forGetUI.getNavMenuDetailColor());
temp.setNavMenuDetaType(forGetUI.getNavMenuDetaType());
这样写确实可以,clone出来一个一样属性的对象,但是那一堆get xx
set xx 也太不软件工程了,感谢群里木木,nil 武汉的建议 原型模式的应用不就自然的解决这种对象的clone问题了.
于是我们开始着手打造第一个原型模式的entity 在Android项目中的使用,虽然很简单
- 我们的entity实现了,Cloneable 从写 clone方法,
这里直接上代码` @Override
public NavMenuDetailEntity clone() {
try {
NavMenuDetailEntity cloneEntity = (NavMenuDetailEntity) super.clone();
cloneEntity.navMenuDetailTitle = this.navMenuDetailTitle;
cloneEntity.navMenuDetailDesc = this.navMenuDetailDesc;
cloneEntity.navMenuDetailIcon = this.navMenuDetailIcon;
cloneEntity.navMenuDetailColor = this.navMenuDetailColor;
cloneEntity.navMenuDetaType = this.navMenuDetaType;// if property is object,so need deep copy cloneEntity.navMenuDetailList = (ArrayList<String>) this.navMenuDetailList.clone(); return cloneEntity; } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; }
}
3.我们在activity中的使用变的很简单了,不见了那些 get set
而变成,
NavMenuDetailEntity temp = forGetUI.clone();`
一句话就能克隆出来一个 属性值完全一样的新对象
而且不见了那种修改temp 改变原始对象值的问题,
java的基础知识,内存中,对象指针的引用,
所以我们避免写出这样的克隆代码
/**
* 创建的新对象在内存中,指针指向了 原型,所以后续修改tempX
* 原型的forgetUI都会变..
*/
NavMenuDetailEntity tempX= forGetUI;
如图所示,
当修改了temp的title为 ktv的时候,原型的title也跟着变了.
所以原型模式无非是解决克隆对象的不二之选,
最后上一张预览GIF,等demo完毕后就开源,