ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式-builder模式的价值

2021-09-04 14:35:21  阅读:118  来源: 互联网

标签:name builder 模式 UserInfo shortName 设计模式 public String


最近在看设计模式,但是对于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

标签:name,builder,模式,UserInfo,shortName,设计模式,public,String
来源: https://www.cnblogs.com/chengmuyu/p/15226507.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有