此篇博客,更换格式为MarkDown,请查看:http://www.javashuo.com/article/p-brqfiten-mr.htmlhtml
如今不少人都在用lombok,经过注解就能够简化代码,省略咱们好多工做。可是其中有两个注解对于咱们建立对象很是好用,一个是@Builder,一个是@Access;java
主要是学习一下@Builder这个注解所涉及到的设计模式;sql
SqlSession sqlSession = new SqlSessionFactoryBuilder() .build(new FileInputStream(new File("/mapper/test.xml"))) .openSession();
@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()); } }
将一个复杂对象的构建与它的表示分离,使得一样的建造过程能够建造不一样的表示;(一句话总结,就是建对象呗,不过对象里面的参数比较多复杂)设计模式
首先,咱们通常建立对象的方法有两种: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
经过建立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; } }
上面说了lombok还提供了 @Access注解,这个注解的原理比较简单,就是将传统的set方法变成静态,返回当前对象;
class A{ private String name; public static A setName(String name){ this.name = name; return this; } }
以上就是对构造器模式的简单介绍。