zoukankan      html  css  js  c++  java
  • 设计模式-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

    喜欢关注一下,不喜欢点评一下
  • 相关阅读:
    mssql分页原理及效率分析
    [ActiveX]使用VS2010创建MFC ActiveX工程项目
    Study notes for Discrete Probability Distribution
    oracle存储过程异常捕获
    (Python学习9)Python虚拟机中的一般表达式
    用Arduino做一个可视化网络威胁级别指示器!
    iOS上线项目源码分享
    android实习程序6——拨号通话
    评价等级使用的五星选择,包含半星的选择
    AJAX实现无刷新验证用户名
  • 原文地址:https://www.cnblogs.com/chengmuyu/p/15226507.html
Copyright © 2011-2022 走看看