设计模式-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;
}
}
以上就是对构造器模式的简单介绍。