设计模式-04 复杂对象创建的建造器模式

    现在很多人都在用lombok,通过注解就可以简化代码,省略我们好多工作。但是其中有两个注解对于我们创建对象非常好用,一个是@Builder,一个是@Accessors(chain = true);

    主要是学习一下@Builder这个注解所涉及到的设计模式;

1.Java框架中常见的建造器模式

1.mybatis获取sqlsession

 SqlSession sqlSession = new SqlSessionFactoryBuilder()
        .build(new FileInputStream(new File("/mapper/test.xml")))
        .openSession();

2.封装controller返回信息

@Data
public class ResultObj {

    private Object result;
    private String message;
    private Integer code;

    private ResultObj(Object result,String message,Integer code){
        this.result = result;
        this.message = message;
        this.code = code;
    }
    public static ResultObj successObj(Object obj){
        return successObj(obj,StatusEnum.SUCCESS.getMessage());
    }
    public static ResultObj successObj(Object obj,String message){
        return new ResultObj(obj,message, StatusEnum.SUCCESS.getCode());
    }
    public static ResultObj failObj(){
        return failObj(StatusEnum.FAIL.getMessage());
    }
    public static ResultObj failObj(String message){
        return failObj(null,message);
    }
    public static ResultObj failObj(Object result,String message){
        return new ResultObj(result,message,StatusEnum.FAIL.getCode());
    }

}

2.什么是构造器模式以及建造器模式的好处

2.1 什么是构造器模式

  将一个复杂对象的构建与它的表示分离,使得同样的建造过程可以建造不同的表示;(一句话总结,就是建对象呗,不过对象里面的参数比较多复杂)

2.2 建造器模式的UML图

2.3 建造器模式的优点及不足

    首先,我们一般创建对象的方法有两种:1.构造器创建;2.通过属性set方法创建;

构造器创建对象:

class  A{
 private String a;
 private String b;
 private  String c ;

 A(){} 
 A(String a){
     this.a = a;
 }  
  A(String a,String b){
     this.a = a;
    this.b = b;
 }
 A(String a,String b,String c){
     this.a = a;
    this.b = b;
    this.c = c ;
 }

}

set方式创建对象

class  B{
 private String a;

 B(){} 
 
  public void setA(){
    this.a = a
  }   
  public String getA(){
    return this.a ; 
  } 
}

分析一下上面两种方式存在的问题:

- 1. 构造器创建对象,多个属性的话,必须严格按照顺序注入;set方法不存在这种问题;

-  2.构造器创建对象,可读性差,如果对象中有多个属性赋值 ,必须清楚每个属性参数位置;set方法不存在这种问题;

- 3.set方法创建对象,对象在使用过程中,容易被错修改; 

根据上面可知,当复杂对象创建时,构造器方法可读性很差,且属性传参不方便,set方法创建对象在使用过程中可能出现误操作的缺点;

建造器模式完美的解决了上面的两种问题;

3.建造器模式的使用

通过创建builder接口,或者内置静态成员类,来创建构造器;

public class NutritionFacts {

    private final int serversize;
    private final int servers;
    private final int calorizes;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;

    static class Builder{
        //必填项
        private final int serversize;
        private final int servers;
        //选填项
        private  int calorizes;
        private  int fat;
        private  int sodium;
        private  int carbohydrate;

        public Builder(int serversize,int servers){
            this.serversize = serversize;
            this.servers = serversize;
        }
        public  Builder calorizes(int calorizes){
            this.calorizes = calorizes;
            return this;
        }
        public Builder fat(int fat){
            this.fat = fat;
            return this;
        }
        public Builder sodium(int sodium){
            this.sodium = sodium;
            return this;
        }
        public Builder carbohydrate(int carbohydrate){
            this.carbohydrate = carbohydrate;
            return this;
        }
        //增加一个创建对象的build
        public NutritionFacts build(){
            return new NutritionFacts(this);
        }
    }

    public NutritionFacts(Builder builder){
        this.serversize = builder.serversize;
        this.servers = builder.servers;
        this.calorizes = builder.calorizes;
        this.fat = builder.fat;
        this.sodium = builder.sodium;
        this.carbohydrate = builder.carbohydrate;
    }


}

4.除了建造器模式,普通对象创建的简易方法

  上面说了lombok还提供了 @Access注解,这个注解的原理比较简单,就是将传统的set方法变成静态,返回当前对象; 
class A{
  private String name;
  
  public static A setName(String name){
      this.name = name;
      return this;
  }      
}

以上就是对构造器模式的简单介绍。

posted @ 2020-07-13 23:23  PerfectLi  阅读(209)  评论(0编辑  收藏  举报