[设计模式] 构造者模式

构造者模式

引用文章

java构造者模式
Mybatis文档

前言

一般在封装实体类时我们通常会用构造方法等形式往实体类传递参数,有可能对不同个数的参数进行初始化,你会定义出不同的构造方法,当然这都没问题,如果是当前实体类中的参数过于多时,这时候再用构造方法传递参数会有点力不从心,很大程度不会影响代码的可读性与美观性。那这个时候构造者模式的出现完美的解决这一问题。

构造者模式的出现很好的解决了多参数初始化的问题。我简单写个例子用来构造一个网络请求地址的实体类,带大家简单了解下什么是构造者模式。

示例

public class ParamsBuilder {
    private String url;
    private String password;
    private String username;
 
    public String getUrl() {
        return url;
    }
 
    public String getPassword() {
        return password;
    }
 
    public String getUsername() {
        return username;
    }
 
 
    public static class Builder {
        private String url = null;
        private String password = null;
        private String username = null;
 
        public Builder url(String url) {
            this.url = url;
            return this;
        }
 
        public Builder username(String username) {
            this.username = username;
            return this;
        }
 
        public Builder password(String password) {
            this.password = password;
            return this;
        }
 
        public ParamsBuilder builder() {
            return new ParamsBuilder(this);
        }
    }
 
 
    private ParamsBuilder(Builder b) {
        url = b.url;
        password = b.password;
        username = b.username;
    }
 
 
    @Override
    public String toString() {
        return "ParamsBuilder " + url + "/?username=" + username + "?password=" + password;
    }
}

初始化的时候

ParamsBuilder params = new ParamsBuilder.Builder()
                .url("wwww.baidu.com")
                .username("xie")
                .password("123")
                .builder();

MyBatis中用构造者模式的类

org.apache.ibatis.mapping.ParameterMapping
在build的时,进行了参数的校验。
此外,org.apache.ibatis.mapping包下有大量的类用到了构造者模式。

public class ParameterMapping {

  private Configuration configuration;

  private String property;
  private ParameterMode mode;
  private Class<?> javaType = Object.class;
  private JdbcType jdbcType;
  private Integer numericScale;
  private TypeHandler<?> typeHandler;
  private String resultMapId;
  private String jdbcTypeName;
  private String expression;

  private ParameterMapping() {
  }

  public static class Builder {
    private ParameterMapping parameterMapping = new ParameterMapping();

    public Builder(Configuration configuration, String property, TypeHandler<?> typeHandler) {
      parameterMapping.configuration = configuration;
      parameterMapping.property = property;
      parameterMapping.typeHandler = typeHandler;
      parameterMapping.mode = ParameterMode.IN;
    }

    public Builder(Configuration configuration, String property, Class<?> javaType) {
      parameterMapping.configuration = configuration;
      parameterMapping.property = property;
      parameterMapping.javaType = javaType;
      parameterMapping.mode = ParameterMode.IN;
    }

    public Builder mode(ParameterMode mode) {
      parameterMapping.mode = mode;
      return this;
    }

    public Builder javaType(Class<?> javaType) {
      parameterMapping.javaType = javaType;
      return this;
    }

    public Builder jdbcType(JdbcType jdbcType) {
      parameterMapping.jdbcType = jdbcType;
      return this;
    }
    ...
    
    public ParameterMapping build() {
      resolveTypeHandler();
      validate();
      return parameterMapping;
    }

    private void validate() {
      if (ResultSet.class.equals(parameterMapping.javaType)) {
        if (parameterMapping.resultMapId == null) { 
          throw new IllegalStateException("Missing resultmap in property '"  
              + parameterMapping.property + "'.  " 
              + "Parameters of type java.sql.ResultSet require a resultmap.");
        }            
      } else {
        if (parameterMapping.typeHandler == null) { 
          throw new IllegalStateException("Type handler was null on parameter mapping for property '"
            + parameterMapping.property + "'. It was either not specified and/or could not be found for the javaType ("
            + parameterMapping.javaType.getName() + ") : jdbcType (" + parameterMapping.jdbcType + ") combination.");
        }
      }
    }

    private void resolveTypeHandler() {
      if (parameterMapping.typeHandler == null && parameterMapping.javaType != null) {
        Configuration configuration = parameterMapping.configuration;
        TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
        parameterMapping.typeHandler = typeHandlerRegistry.getTypeHandler(parameterMapping.javaType, parameterMapping.jdbcType);
      }
    }

猜你喜欢

转载自blog.csdn.net/weixin_36210698/article/details/83151324