建造者设计模式

面向对象分析和设计,要考设计模式,所以整理了一下同时加深自己的印象

所谓建造者设计模式就是将一个复杂的对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示。

首先老师让我们用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.csdn.net/yinbucheng/article/details/72616890, 这里还有时序图奥,而且他写的比我强太多。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值