高级Java编程 - 多个构造函数时考虑Builder模式

问题思考

设计一个网络库,那么访问的Url是所必须的参数。其他参数诸如Http Header、请求超时、链接超时、请求方法、回调响应结果等都属于非必须参数。那么如何设计才能告诉使用者Url是必须的而其他参数是可选的。

为了让大家更能简单理解,贴近自然。以人举例,人的生存所必须的三个物质是 空气、水、食物。至于衣服、金钱、girl、game等其实都是非必须的。那如何告诉女娲呢?

解决思路一 重叠构造函数

我们知道,良好命名的函数参数以及注释能够很好的告诉使用者 “我需要哪些参数,哪些是必须的”  那如果实现创建人的功能及拓展功能,代码大概是存在参数必须的构造函数,还有其他附加功能的构造函数。假设有3个附加功能选项,组合起来有多少种可能。2的3次方-1 = 7种 !如果附加项功能有10个呢 ? 那种代码量和复杂度是相当可怕的,代码看起来是这样的。



图中展示了另外一个很重要的问题 - 当同名方法的参数个数,类型,顺序一致时无法被重写。编译器会告诉你函数重复了。

综上我们看到利用构造函数迭代,无法优雅的解决需求,甚至有弊端。

解决思路二 JavaBean

很多同学一定会想到,既然重叠构造器不行,那么我利用JavaBean的设置,来灵活的设置人的属性就可以了。利用JavaBean来解决的代码大概是Person 的必须和非必须成员变量实现了getter和setter 调用代码是这样子的


这样解决了多个构造器产生的一系列问题,但这样就优雅了么,否!

问题有两点 

1. 无法很好的限制告诉使用者哪些是必要参数

有人会说,那我提供一个必要参数的构造函数,文档上注明。那可不是优雅的办法,兄弟~

有人会说,那我利用简单工厂模式,设置一个人的默认实现,兄弟,你很灵醒啊,的确是可以的,但我觉得使用Builder来做更适合,这里不做讨论。其实模式本身就很灵活,半用,衍变用,结合用,用到随心所欲才是大成境界。

2.JavaBean在程序运行中无法保证状态不被修改,一旦被修改在最终调用时假设报错了,很难查找原因 

我想大家在做Listview的时候,也许遇到过没有维护好数据源,导致在程序运行中数据源非正常改变,数据列表不正确的事情。这足矣说明我们内存中的数据无意间变了,对于查找问题是相当困难的。如果要使用JavaBean解决问题,首要考虑的就是线程安全问题,保证其合理运行中被“冻结”


思路三 利用Builder建造器代替构造函数

首先看下我们十分熟悉的Universal-Image-Loader的初始化代码


哇,看到后是否觉得这种方式十分优雅!的确,目前很多第三方库的对象创建都采用这种方式,你想想还看到过哪些?

那么对于本文中创造人代码如何去做呢?如下


Person类里面有一个静态内部类Builder,Person的构造函数为私有,防止被外部创建。把真正创建Person对象的方法放在Builder内。我们看下Builder


第一 提供默认必须参数的构造器,这是人生存的三种必需品

第二 每个附加功能衣服,金钱,女人的方法返回Builder对象,这样代码上可以完成链式调用

第三 build() 创建真正的对象

本质

Builder模式本质   分离整体构建算法和部件构造

结束语

如果类的构造函数含有多个多参数时,特别是大多数参数是可选的,设计这种类时,Builder模式就值得使用。它比传统的重叠构造函数相比代码更少,使用者更易读,出错后查找简单,另外Builder比JavaBean的方式更加安全。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容