基础设计模式-04 复杂对象建立的建造器模式

此篇博客,更换格式为MarkDown,请查看:http://www.javashuo.com/article/p-brqfiten-mr.htmlhtml

    如今不少人都在用lombok,经过注解就能够简化代码,省略咱们好多工做。可是其中有两个注解对于咱们建立对象很是好用,一个是@Builder,一个是@Access;java

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

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方法建立;session

构造器建立对象:mybatis

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方式建立对象app

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方法建立对象在使用过程当中可能出现误操做的缺点;学习

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

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;
  }      
}

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

相关文章
相关标签/搜索