只关心零件的Buider
来源:互联网 发布:香蕉网络免费频道 编辑:程序博客网 时间:2024/04/29 18:26
只关心零件的Buider
建造者模式的初衷是为了将对象的构建与表示分离,封装一个对象的不懂表现方式。但往往实习使用中,我们的需求并没有那么多的表现方式,且遇到最多的Builder也不是定义中的Builder。
==============
定义
传统定义:将复杂对象的构建与它的表示分离,使得同样的构建有着不同的表现方式。
实际使用的Builder:依照赋予的不同参数,去创建不同表现的对象。
这是我们最常见到的Builder形式。
embedManager = new EmbedManager.Builder(this, layoutResID) .addToolbar(R.layout.widget_toolbar, R.id.id_tool_bar) .addTopWidget(LayoutInflater.from(this).inflate(R.layout.widget_top_view, null)) .addBottomWidget(LayoutInflater.from(this).inflate(R.layout.widget_bottom_view, null)) .addCenterTipView(new NoDataTips(this)) .addLoadView(LayoutInflater.from(this).inflate(R.layout.widget_loading_view, null)) .build();
演化
实际过程中,普通建造者模式的使用场景并不是特别多。在实际需求中,最多的需求反而是参数的不确定。什么是参数的不确定呢?
通常我们给一个类传参时,使用这样的方式:
obj.setParam(int arg1,int arg2,int arg3,int arg3);
那么问题来了,如果我只有arg1,和arg2需要传递怎么办?
arg3传null? 增加新的重载方法? 哦~这样的体验说实话并不好。有更好的替代方式吗?有的
就是上面你看到的形式。通常我们这样定义,依照代码注释,你可以很轻松的学会这样的设计技巧。
class EmbedManager { private Object arg1; private Object arg2; private Object arg3; public EmbedManager(Object arg1,Object arg2,Object arg3){ if(arg1 != null){ 。。。 } if(arg2 != null){ 。。。 } if(arg3 != null){ 。。。 } 。。。。。 } //负责创建EmbedManager的建造者 public static class Builder{ //arg1是必须参数 private Object arg1; //arg2,arg3是可选参数 private Object arg2; private Object arg3; //必须参数通过构造函数传递 public Builder(Object arg1){ this.arg1 = arg1; } public Builder setArg2(Object arg2){ this.arg2 = arg2; //设置成功后返回this本对象 return this; } public Builder setArg3(Object arg3){ this.arg3 = arg3; //设置成功后返回this本对象 return this; } //最后负责创建的类 public EmbedManager build(){ EmbedManager em = new EmbedManager(arg1,arg2,arg3); ... em.setTitle("xxxx"); em.set~ em.set~ return em; } }}
优点
你可以很轻易的发现它的优点,将对象复杂创建过程进行封装,实现了解耦。
使用体验的优化,参数控制更加容易。
更灵活的配置化实现
误区
无论是原本的建造者模式,还是演化后的建造者模式,在合适的场景下都非常优秀,很难找到缺点。
这里就说一个演化后的建造者使用误区:
有些人因为喜欢演化后的建造者模式清晰的写法而使用了它。但它却用文档形式硬性的告诉你,我的这些个参数你必须都有,这并不是一个很好的使用。
既然使用了这样形式的配置化写法,就隐式的告诉了用户我的这些参数是可有可无的,这样用文档形式规定是非常容易出错的。
0 0
- 只关心零件的Buider
- buider模式的缺陷
- 我,只关心接口
- 我们只关心错误
- 【转载】开关电源的零件
- 常用零件的封装
- 软件的零件化
- 汉字的零件儿
- 列表比较只关心元素数据
- 程序员可以只关心技术么?
- 【畅言】程序员可以只关心技术么?
- 那些过分的关心,其实不是关心
- 零件的3D设计
- 最近关心的技术
- 关心自己的福利!
- 给关心的人
- 谢谢大家的关心
- 朋友的关心~
- Maven简介(一)
- 模板,新手读代码砸电脑的诱因
- ssh获取session
- 关于微信退款出现错误代码:52的解决方法
- 1012
- 只关心零件的Buider
- hrbust/哈理工oj 1126 Final Destination II【矩阵快速幂+递推】
- MaterialDrawer使用指南
- Android数据库greenDAO框架用法和源码分析
- jws,axis2,Xfire以及cxf对比
- LeetCode--223. Rectangle Area
- 拒绝装饰模式
- unity3D OnTriggerEnter和OnCollisionEnter的一点个人心得(主要讲区别)
- 【小镇的技术天梯】C语言,冒泡、快速、希尔、选择排序