建造者设计模式
面向对象分析和设计,要考设计模式,所以整理了一下同时加深自己的印象
所谓建造者设计模式就是将一个复杂的对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示。
首先老师让我们用Lombok插件里面的@Builder直接自动生成有关建造者设计模式的代码,生成是生成了,就像下面这样:
先是要用到建造者设计模式的类,然后类上面@Builder
import lombok.Builder; @Builder public class Dept1 { private Integer deptno; private String dname; private String loc; }
public class Dept1 { private Integer deptno; private String dname; private String loc; Dept1(Integer deptno, String dname, String loc) { this.deptno = deptno; this.dname = dname; this.loc = loc; } public static Dept1.Dept1Builder builder() { return new Dept1.Dept1Builder(); } public static class Dept1Builder { private Integer deptno; private String dname; private String loc; Dept1Builder() { } public Dept1.Dept1Builder deptno(Integer deptno) { this.deptno = deptno; return this; } public Dept1.Dept1Builder dname(String dname) { this.dname = dname; return this; } public Dept1.Dept1Builder loc(String loc) { this.loc = loc; return this; } public Dept1 build() { return new Dept1(this.deptno, this.dname, this.loc); } public String toString() { return "Dept1.Dept1Builder(deptno=" + this.deptno + ", dname=" + this.dname + ", loc=" + this.loc + ")"; } } }
诺,上边就是自动生成的代码,看着很高大上,可是我,我有点看不懂。
所以只好求助百度查看完整的建造者设计模式,这次看懂了,总结如下
1. 首先,你得有一个要执行建造者设计模式的类,这点和上面倒是挺相似,不过这次没有用lombok的东西,老老实实的getter,setter方法,就有了如下代码:
public class Dept { private Integer deptno; private String dname; private String loc; public Integer getDeptno() { return deptno; } public void setDeptno(Integer deptno) { this.deptno = deptno; } public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } public String getLoc() { return loc; } public void setLoc(String loc) { this.loc = loc; } public Dept() { } public Dept(Integer deptno, String dname, String loc) { this.deptno = deptno; this.dname = dname; this.loc = loc; } @Override public String toString() { return "Dept{" + "deptno=" + deptno + ", dname='" + dname + '\'' + ", loc='" + loc + '\'' + '}'; } }
2. 然后要定义一个抽象建造者,这个抽象建造者呢,它主要负责创建复杂对象的各个组件,还能返回出来一个要建造的复杂对象。但注意,它只是一个接口,没有具体的方法实现。代码如下:
public interface Builder { void buildDeptno(); void buildDname(); void buildLoc(); Dept getResult(); }
3. 既然上面我们都定义接口了,接下来肯定就是接口的实现了,就像这样:
public class ConcretBuilder implements Builder{ private Dept dept = new Dept(); @Override public void buildDeptno() { dept.setDeptno(111); } @Override public void buildDname() { dept.setDname("111"); } @Override public void buildLoc() { dept.setLoc("222"); } @Override public Dept getResult() { return dept; } }
4. 好了,现在接口也实现了,我们看起来已经大功告成了,但但但请注意,我们建造的是一个复杂对象,就像建造一栋楼,肯定得有个建造的先后顺序,比如我们只有先打好地基才能接着盖楼最楼才能封顶。所以这个时候我们需要一个指挥者来指挥我们建造的顺序,是这样没错了:
public class Director { private Builder builder; public Director(Builder builder) { this.builder = builder; } public void construct(){ builder.buildDeptno(); builder.buildDname(); builder.buildLoc(); } }
5. 现在才是真正的大功告成我们就来测试一下我们的成果吧:
public class DeptTest { public static void main(String[] args) { Builder builder = new ConcretBuilder(); Director director = new Director(builder); director.construct(); Dept dept = builder.getResult(); System.out.println(dept.getDeptno()); System.out.println(dept.getDname()); System.out.println(dept.getLoc()); } }
6. 结果呢,肯定是有结果的,结果在这2333:
"C:\Program Files\Java\jdk1.8.0_151\bin\java" "-javaagent:E:\JetBrains\IntelliJ IDEA
111
111
222
7. 想看类图吗,给你给你都给你,不过类图是我盗的,去看原类图点这里:https://blog.****.net/yinbucheng/article/details/72616890, 这里还有时序图奥,而且他写的比我强太多。