专栏首页Liusy01【设计模式-建造者模式】

【设计模式-建造者模式】

上一篇说了工厂方法模式和抽象工厂模式,今来聊聊建造者模式。

一、定义

将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。

类似组将一台电脑,有主机、屏幕、鼠标、键盘等,你将这些组件的型号给组装店说好,他就会根据你的需求组装电脑,但是你不会看见具体的组装过程。

建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。

二、实例

像上面说的电脑组装实例,就有三个对象,一个是电脑,一个是组装者,一个是客户。

电脑对象:

public class Computer {

    private String screen;
    private String keyboard;
    private String mouse;
    private String host;
    
    //隐藏get、set方法
}

builder类:(相当于每个组件的购买者,具体组装过程是先装什么,后装什么,由组装者决定)

抽象builder类
public interface ComputerBuilder {
    public void buildScreen(String screenName);
    public void buildHost(String hostName);
    public void buildKeyboard(String keyboardName);
    public void buildMouse(String mouseName);
    public Computer buildComputer();
}
实际builder类
public class ComputerActualBuilder implements ComputerBuilder {
    Computer computer = new Computer();
    @Override
    public void buildScreen(String screenName) {
        computer.setScreen(screenName);
    }
    @Override
    public void buildHost(String hostName) {
        computer.setHost(hostName);
    }
    @Override
    public void buildKeyboard(String keyboardName) {
        computer.setKeyboard(keyboardName);
    }
    @Override
    public void buildMouse(String mouseName) {
        computer.setMouse(mouseName);
    }
    @Override
    public Computer buildComputer() {
        return computer;
    }
}

组装者:

public class Assembler {
    ComputerBuilder computerBuilder;
    public Assembler(ComputerBuilder computerBuilder) {
        this.computerBuilder = computerBuilder;
    }
    public Computer buildComputer(String scrren,String mouse,String keyboard,String host){
        computerBuilder.buildScreen(scrren);
        computerBuilder.buildMouse(mouse);
        computerBuilder.buildKeyboard(keyboard);
        computerBuilder.buildHost(host);
        return computerBuilder.buildComputer();
    }
}

客户端:

ComputerBuilder computerBuilder = new ComputerActualBuilder();
Assembler assembler = new Assembler(computerBuilder);
Computer computer = assembler.buildComputer("三星屏幕", "雷蛇鼠标", "雷蛇键盘", "外星人主机");

客户只需说出具体需求,组装者就会帮忙组装好,客户并不需要知道具体的组装过程是如何的。

类图如下:

上面是有点复杂的版本,其实还有一个简单的版本,类似与StringBuilder的append方法。

就只有builder类还有电脑类:

比如:

public class Computer {
    private String screen;
    private String keyboard;
    private String mouse;
    private String host;
    
    public Computer(ComputerBuilder builder) {
        this.screen = builder.screen;
        this.keyboard = builder.keyboard;
        this.mouse = builder.mouse;
        this.host = builder.host;
    }

    //隐藏get、set方法
   
    static class ComputerBuilder{
        private String screen;
        private String keyboard;
        private String mouse;
        private String host;
        
        1、每个建造方法都返回一个当前对象,这样就可以持续调用方法
        public ComputerBuilder buildScreen(String screen){
            this.screen = screen;
            return this;
        }

        public ComputerBuilder buildKeyboard(String keyboard){
            this.keyboard = keyboard;
            return this;
        }

        public ComputerBuilder buildMouse(String mouse){
            this.mouse = mouse;
            return this;
        }

        public ComputerBuilder buildHost(String host){
            this.host = host;
            return this;
        }
        
        2、最后将当前对象作为参数构造Computer
        public Computer build(){
            return new Computer(this);
        }


    }
}

上面的使用方法如下:

Computer computer = new Computer.ComputerBuilder()
                .buildMouse("雷蛇鼠标")
                .buildHost("外星人主机")
                .buildKeyboard("雷蛇键盘")
                .buildScreen("三星屏幕").build();
System.out.println(computer);

交由静态内部类ComputerBuilder去实现建造过程。

三、源码实例

(1)StringBuffer和SpringBuilder的append方法就是建造者的

(2)代码中用TransportClient连接es的时候,需要设置连接属性的Settings,

ok,这个就是建造者模式!

希望能帮到你。

本文分享自微信公众号 - Liusy01(Liusy_01),作者:Liusy01

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ZK实现分布式锁

    上一篇说了ZK是什么以及能干什么,今儿这篇就来用ZK实现分布式锁,分别用java原生的zookeeper客户端、ZKClient实现。

    Liusy
  • k8s之HTTP请求负载分发

    对于基于HTTP的服务来说,不同的URL地址经常对应不同的后端服务或者虚拟服务器,通常的做法是在应用前添加一个反向代理服务器Nginx,进行请求...

    Liusy
  • 【设计模式-工厂相关模式】

    定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。

    Liusy
  • Java8-Lambda表达式-函数式接口

    Erwin
  • 面试官:兄弟,讲一下责任链模式

    各位java技术爱好者,我们又见面了! 之前我在面试的时候被问到责任链模式的问题,当时答不上来。这件事就一直在我心里耿耿于怀。相信很多人面试完都有这种体验,哈哈...

    java技术爱好者
  • day28_Struts2综合案例

    a、拷贝必要的jar包(图中黄色框框) 和 与数据库操作有关的jar包与配置文件(图中绿色框框)

    黑泽君
  • java中复制对象通过反射或序列化

    在使用缓存读取数据后修改发现缓存被修改。于是找了下复制对象的方法。 关于对象克隆 ---- 按我的理解,对象是包含引用+数据。通常变量复制都是将引用传递过去。比...

    Ryan-Miao
  • 夯实Java基础系列3:一文搞懂String常见面试题,从基础到实战

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

    黄小斜
  • Spring IoC 容器事件

    Spring容器除了提供Bean的生命周期扩展点,还需要提供容器的生命周期扩展点。容器不像bean一样是由开发者定义的。框架代码编写的时候并不知道谁会关心。所以...

    李鸿坤
  • 异常设计实践

    前段时间结合SpringCloud网关处理异常写了篇 异常处理实践,侧重于异常的处理。作为强迫症患者,本次撰写下如何进行异常设计并提供具体的代码。

    码代码的陈同学

扫码关注云+社区

领取腾讯云代金券