最近在看设计模式,但是对于builder模式一直感觉很鸡肋.因为本身你就是要创建对象.直接set,get值简单直接.而使用builder需要再额外写一遍参数,再传值,最后再new要创建的对象,再赋值.感觉相当无效.
但是在看完一篇博客后,发现自己的想法还是有点狭隘.毕竟大家都"吹"的东西,肯定有对应的价值.
实际对象传值方式大家也都知道,基本博客上都会写:
1. 构造方法
2. new之后,set值
3. builder模式三种
实际三种方式都有自己的应用场景,没有完全优于其他的方式.
下面以UserInfo举例:
UserInfo{
name;
shortName;
}
- 构造方法
优点:简单直接;
缺点: 参数不直观;不易扩展;
new UserInfo("wang","zhang");
如果你不看构造方法定义,你无法区分两个字段的含义;
- set
优点: 直观,灵活
缺点: 方法对外可见,可任意进行赋值操作
UserInfos = new UserInfo();
t.setName("wang");
t.setShortName("zhang");
可以直观的看出操作方法,但是如果你要控制已经生成的对象不能再进行set操作时,就无能为力了.同时这种写法也不简洁;
- builder
优点:灵活,参数控制强;
缺点:结构复杂
public class UserInfo {
private String name;
private String shortName;
// 私有化无参构造函数
private UserInfo() {
}
public static class Builder {
private String name;
private String shortName;
public Builder name(String name) {
this.name = name;
return this;
}
public Builder shortName(String shortName) {
this.shortName = shortName;
return this;
}
public UserInfo build() {
UserInfo info = new UserInfo();
info.name = this.name;
info.shortName = this.shortName;
return info;
}
}
public String getName() {
return name;
}
public String getShortName() {
return shortName;
}
}
核心价值是将赋值操作进行封装,对象对外只能进行取值.这样来控制已生成对象不支持修改.实现变量的控制.写法不简洁,使用方便;
实际使用中也看场景.如果场景简单,构造方法比较适合;如果支持对象创建后再进行修改操作,使用set比较直观灵活;如果要拆分赋值和使用,builder模式更好一些.
- 参考资料
系统重构之道-通过Builder去除Bean的Set和Get