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

设计模式-建造者模式

作者头像
逍遥壮士
发布2020-09-18 11:22:43
3640
发布2020-09-18 11:22:43
举报
文章被收录于专栏:技术趋势

建造者模式是什么?

建造者模式属于创建型模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。用于专门创建个性化的对象。区别于工厂,每个工厂生产出来的产品都是一样的,而建造者可以根据用户的不同需要,生产不同的产品。

其中包含角色:

Builder:抽象建造者

ConcreteBuilder:具体建造者

Director:指挥者/监工

Product:产品

建造者模式可以干嘛?

主要用来创建个性化的产品,主要解决同一样的产品输出不同的个性化要求。比如:你需要一台台式电脑,其中包含:显示器、机箱(主板、内存条、显卡、硬盘、键盘、鼠标)等,如果是工厂模式,每个工厂输出的产品都是一模一样的配置。而如果是建造者模式,可以个性化选配,比如高配和低配。而其中你(指挥者)、电脑(产品)、装电脑人员(具体建造者)、抽象建造者(人/组装人员)

优点:

解耦:不同的组件可以个性化选择,精细化的控制每个产品的创建过程;

易拓展:新增加一些属性和功能很方便;

符合开闭原则:原功能不受影响,需要新的功能在基础上增加就可以了;

缺点:

该模式只适合创建出来的产品存在很多共同点,而不是差异性很大,所以使用范围受到一定的限制;

如果产品内部过于复杂,会导致代码可读性降低,代码臃肿;

类图

注意:建议先看下这个类图,若不懂请看到懂为止,实在看不懂多找点资料吧,我是踩过坑的,需要要了解一下原理!切记!切记!切记!

实现代码

代码语言:javascript
复制
package com.hong.base.buildmodel.computer;

/**
 * @Auther: csh
 * @Date: 2020/5/18 11:17
 * @Description:抽象电脑(抽象产品)
 */
public class Computer {
    //cpu
    private String cpu;
    //品牌
    private String brand;
    //主板
    private String mainBorad;
    //显示器
    private String displayer;
    //价格
    private String money;

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getMainBorad() {
        return mainBorad;
    }

    public void setMainBorad(String mainBorad) {
        this.mainBorad = mainBorad;
    }

    public String getDisplayer() {
        return displayer;
    }

    public void setDisplayer(String displayer) {
        this.displayer = displayer;
    }

    public String getMoney() {
        return money;
    }

    public void setMoney(String money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", brand='" + brand + '\'' +
                ", mainBorad='" + mainBorad + '\'' +
                ", displayer='" + displayer + '\'' +
                ", money='" + money + '\'' +
                '}';
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/5/18 11:13
 * @Description:抽象建造者
 */
public abstract class Builder {
    //吕牌
    public abstract void buildBrand();
    //cpu
    public abstract void buildCpu();
    //主版
    public abstract void buildMainBoard();
    //显示器
    public abstract void buildDisplay();
    //获取电脑
    public abstract Computer getComputer();
    
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/5/18 11:49
 * @Description:戴尔笔记本(builder角色)
 */
public class DellComputerBuilder extends Builder {

    private Computer computer = new Computer();

    @Override
    public void buildBrand() {
        computer.setBrand("戴尔笔记本");
    }

    @Override
    public void buildCpu() {
        computer.setCpu("16核");
    }

    @Override
    public void buildMainBoard() {
        computer.setMainBorad("1万块主板");
    }


    @Override
    public void buildDisplay() {
        computer.setDisplayer("戴尔显示器");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
    
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/5/18 14:11
 * @Description:联想建造者
 */
public class LenovoComputerBuilder extends Builder {

    private Computer computer = new Computer();

    @Override
    public void buildBrand() {
        computer.setBrand("联想电脑");
    }

    @Override
    public void buildCpu() {
        computer.setCpu("低配版");
    }

    @Override
    public void buildMainBoard() {
        computer.setMainBorad("低配主板");
    }


    @Override
    public void buildDisplay() {
        computer.setDisplayer("16寸显示器");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/5/18 14:13
 * @Description:组装类(指挥者)
 * 该类是指挥拼专的,就像以前的监工
 */
public class ComputerDirector {
    public Computer construct(Builder builder){
        //构建产品
        Computer computer;
        builder.buildBrand();
        builder.buildCpu();
        builder.buildDisplay();
        builder.buildMainBoard();
        computer = builder.getComputer();
        return computer;
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/5/18 14:15
 * @Description:建造者模式测试
 */
public class Client {
    public static void main(String[] args) {
        ComputerDirector director = new ComputerDirector();
        Computer construct = director.construct(new LenovoComputerBuilder());
        System.out.println(construct);
        System.out.println("-----------------------------------------------");
        Computer construct1 = director.construct(new DellComputerBuilder());
        System.out.println(construct1);
    }
}

结果

代码语言:javascript
复制
Computer{cpu='低配版', brand='联想电脑', mainBorad='低配主板', displayer='16寸显示器', money='null'}
--------------------
Computer{cpu='16核', brand='戴尔笔记本', mainBorad='1万块主板', displayer='戴尔显示器', money='null'}

实现场景

日常开发过程中,遇到一些组件经常变换,这种就比较适合建造者模式了,比如同一部手机有不同的颜色,不同的配置,但是基础的外型是一致的。

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

本文分享自 技术趋势 微信公众号,前往查看

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

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

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