type
status
date
slug
summary
tags
category
icon
password
💡
建造者模式是用于创建复杂对象的,保持代码的可读性和灵活性。建造者模式将对象的构建过程与其表示分离。这种模式在开发中经常用到,传统的建造者模式写法在开发中没怎么见过,这里只介绍链式的建造者模式。
结构很简单,这里直接上代码了

模板代码

学生对象的创建需要5个字段,其中id和name是必须的,其他是可选的,我们希望该对象创建后不可随意修改,所以将变量都加上了final修饰,学生类只保留了get方法,禁止set方法。
建造者模式需要用一个建造者类来生成对象,不允许直接调用学生类的构造函数生成对象,所以在student的构造函数加上了private。
接下来我们看建造者类StudentBuilder ,它和Student有一样的变量字段,由于id和name是必须的,所以把这两个值放到构造函数赋值,其他变量通过set赋值,并且set的返回值依然是StudentBuilder 对象,这样可以链式调用,最后使用build方法生成对象。
建造者代码非常优雅,这是一个链式调用,用1行代码就搞定,更重要的是可读性非常强,而且通过build()可以很明确的告诉别人Student已经创建完毕。
builder设计模式非常灵活,一个builder可以创建出各种各样的对象,只需要在build()之前调用set方法来为对象赋值。 builder模式另一个重要特性是:它可以对参数进行合法性验证,如果传入的参数无效,可以抛出一个IllegalStateException异常,但是在哪里进行参数合法性验证也是有讲究的:那就是在对象创建之后进行合法性验证。修改StudentBuilder的build()方法:
一定要先创建对象再盘对,因为StudentBuilder是线程不安全的,如果先进行参数验证后创建对象,那么创建对象的时候对象的属性可能已经被其他线程改变了。
最后总结一下builder设计模式:当类中有很多属性的时候,尤其是有很多可选属性的时候,就可以使用builder设计模式,因为这样不仅可以使类使用起来很优雅,而且还可以给类的对象一个创建完成的标识,即build()方法。

使用实例Dialog

安卓开发中使用dialog就会用的builder模式,这里的create就是上面的build方法
dialog源码
通过Builder来设置AlertDialog中的title,、message、button等参数, 这些参数都存储在类型为AlertController.AlertParams的成员变量P中,AlertController.AlertParams中包含了与之对应的成员变量。在调用Builder类的create函数时才创建AlertDialog, 并且将Builder成员变量P中保存的参数应用到AlertDialog的mAlert对象中,即P.apply(dialog.mAlert)代码段。
就是把P中的参数依次设置到AlertController中, 也就是AlertDialog中的mAlert对象。从AlertDialog的各个setter方法中可以看到,实际上也都是调用了mAlert对应的setter方法。

📎 参考

工厂模式责任链模式(Okhttp)
LuluNotion
LuluNotion
一个普通的干饭人🍚
公告
type
status
date
slug
summary
tags
category
icon
password
🎉NotionNext 4.0即将到来🎉
-- 感谢您的支持 ---
👏欢迎更新体验👏