设计模式-builder模式的价值

最近在看设计模式,但是对于builder模式一直感觉很鸡肋.因为本身你就是要创建对象.直接set,get值简单直接.而使用builder需要再额外写一遍参数,再传值,最后再new要创建的对象,再赋值.感觉相当无效.

但是在看完一篇博客后,发现自己的想法还是有点狭隘.毕竟大家都"吹"的东西,肯定有对应的价值.

实际对象传值方式大家也都知道,基本博客上都会写:

1. 构造方法
2. new之后,set值
3. builder模式三种

实际三种方式都有自己的应用场景,没有完全优于其他的方式.

下面以UserInfo举例:

UserInfo{
    name;
    shortName;
}
  1. 构造方法

优点:简单直接;
缺点: 参数不直观;不易扩展;

new UserInfo("wang","zhang");

如果你不看构造方法定义,你无法区分两个字段的含义;

  1. set

优点: 直观,灵活
缺点: 方法对外可见,可任意进行赋值操作

UserInfos = new UserInfo();
t.setName("wang");
t.setShortName("zhang");

可以直观的看出操作方法,但是如果你要控制已经生成的对象不能再进行set操作时,就无能为力了.同时这种写法也不简洁;

  1. 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

上一篇:angular 复选框


下一篇:算法之复制复杂链表