前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【设计模式-建造者模式】

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

作者头像
Liusy
发布2020-09-01 16:21:58
3960
发布2020-09-01 16:21:58
举报
文章被收录于专栏:Liusy01

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

一、定义

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

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

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

二、实例

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

电脑对象:

代码语言:javascript
复制
public class Computer {

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

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

代码语言:javascript
复制
抽象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;
    }
}

组装者:

代码语言:javascript
复制
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();
    }
}

客户端:

代码语言:javascript
复制
ComputerBuilder computerBuilder = new ComputerActualBuilder();
Assembler assembler = new Assembler(computerBuilder);
Computer computer = assembler.buildComputer("三星屏幕", "雷蛇鼠标", "雷蛇键盘", "外星人主机");

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

类图如下:

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

就只有builder类还有电脑类:

比如:

代码语言:javascript
复制
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);
        }


    }
}

上面的使用方法如下:

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

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

三、源码实例

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

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

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

希望能帮到你。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Liusy01 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档