侧边栏壁纸
博主头像
Monkey部落博主等级

Monkey部落,分享技术、经验、遇到的问题及解决方法,欢迎大家互相讨论分享。

  • 累计撰写 43 篇文章
  • 累计创建 35 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

JAVA设计模式-建造者模式

Monkey部落
2022-09-21 / 0 评论 / 1 点赞 / 79 阅读 / 1,396 字

JAVA设计模式-建造者模式

介绍

建造者模式是通过一步一步的步骤构建一个包含多个部件的对象,每个不同的对象都是具有相同的构建过程。适用于复杂对象的构建,用户不需要知道具体的构建细节,只需要指定对象的类型即可。建造者模式将对象的构建和装配进行了解耦,可以使用不同的构建器,相同的装配过程构造出不同的对象。

场景

适用于一个复杂的对象,这个对象是由多个对象或者简单的属性组合而成,再通过稳定的一系列构造步骤一步步的构造出来。

主要内容

抽象的建造者类(Builder): 为创建一个复杂对象的各个部件指定抽象的接口,但是不实现这些具体部件的创建,每个具体部件的创建由具体的建造者来完成。

具体的建造者类(ConcreteBuilder): 实现上方的Builder接口,并且实现抽象接口里面每个部件的具体的实现,在部件全部构造完成后也会提供一个返回这个复杂对象的方法。

Director: 构造一个使用了Builder接口的具体的对象,它会调用具体的建造者类来创建具体的复杂对象每个部件,最后返回这个对象。Director里面不涉及具体的对象的任何信息,只包装这个复杂对象的各个部件的正确创建并且按照一定的构建顺序构建。

Product: 需要被构造的复杂对象。

代码示例

Computer类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.builder
 * @Description: 电脑
 * @Author: xpy
 * @Date: Created in 2022年09月21日 1:45 下午
 */
public class Computer {

    /**
     * CPU
     */
    private String cpu;
    /**
     * 主板
     */
    private String mainBoard;
    /**
     * 内存
     */
    private String memory;

    public String getCpu() {
        return cpu;
    }

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

    public String getMainBoard() {
        return mainBoard;
    }

    public void setMainBoard(String mainBoard) {
        this.mainBoard = mainBoard;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }
}

ComputerBuilder类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.builder
 * @Description: 电脑接口
 * @Author: xpy
 * @Date: Created in 2022年09月21日 1:43 下午
 */
public interface ComputerBuilder {

    /**
     * 构建CPU
     */
    void buildCpu();

    /**
     * 构建主板
     */
    void buildMainBoard();

    /**
     * 构建内存
     */
    void buildMemory();
    
    Computer buildComputer();
}

OfficeComputerBuilder类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.builder
 * @Description: 办公电脑
 * @Author: xpy
 * @Date: Created in 2022年09月21日 1:52 下午
 */
public class OfficeComputerBuilder implements ComputerBuilder {

    Computer computer;

    public OfficeComputerBuilder() {
        this.computer = new Computer();
    }

    public void buildCpu() {
        computer.setCpu("办公电脑CPU");
    }

    public void buildMainBoard() {
        computer.setMainBoard("办公电脑主板");
    }

    public void buildMemory() {
        computer.setMemory("办公电脑内存");
    }

    public Computer buildComputer() {
        return computer;
    }
}

GameComputerBuilder类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.builder
 * @Description: 办公电脑
 * @Author: xpy
 * @Date: Created in 2022年09月21日 1:52 下午
 */
public class GameComputerBuilder implements ComputerBuilder {

    Computer computer;

    public GameComputerBuilder() {
        this.computer = new Computer();
    }

    public void buildCpu() {
        computer.setCpu("游戏电脑CPU");
    }

    public void buildMainBoard() {
        computer.setMainBoard("游戏电脑主板");
    }

    public void buildMemory() {
        computer.setMemory("游戏电脑内存");
    }

    public Computer buildComputer() {
        return computer;
    }
}

ComputerDirector类

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.builder
 * @Description: 电脑构造指挥者
 * @Author: xpy
 * @Date: Created in 2022年09月21日 1:58 下午
 */
public class ComputerDirector {

    public Computer assemble(ComputerBuilder cb) {
        cb.buildCpu();
        cb.buildMainBoard();
        cb.buildMemory();
        return cb.buildComputer();
    }

    public static void main(String[] args) {
        Computer officeComputer = new ComputerDirector().assemble(new OfficeComputerBuilder());
        Computer gameComputer = new ComputerDirector().assemble(new GameComputerBuilder());
    }
}

扩展

简化结构

简化构造结构,可以将ComputerDirector里面的装配放到每个Builder里面,但是这样会导致每个Builder的职责增加,不符合软件设计原则中的单一职责原则。

代码示例

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.builder
 * @Description: 平板电脑
 * @Author: xpy
 * @Date: Created in 2022年09月21日 4:30 下午
 */
public class TabletComputerBuilder implements ComputerBuilder {

    Computer computer;

    public TabletComputerBuilder() {
        this.computer = new Computer();
    }

    public void buildCpu() {
        computer.setCpu("平板电脑CPU");
    }

    public void buildMainBoard() {
        computer.setMainBoard("平板电脑主板");
    }

    public void buildMemory() {
        computer.setMemory("平板电脑内存");
    }

    public Computer buildComputer() {
        return computer;
    }

    public Computer assemble() {
        this.buildCpu();
        this.buildMainBoard();
        this.buildMemory();
        return this.buildComputer();
    }

    public static void main(String[] args) {
        Computer tabletComputer = new TabletComputerBuilder().assemble();
    }
}

第二种创建对象方法

我们创建对象时总会要传入一些参数,如果每个都是放在构造方法里面传入,这样可能会参数很多,代码可读性差,对应不上可能还会导致传入错误,我们可以使用构造者模式并且支持链式调用解决参数过多问题。

代码示例

/**
 * All rights Reserved, Designed By monkey.blog.xpyvip.top
 *
 * @version V1.0
 * @Package com.xpyvip.designpattern.builder
 * @Description: 工控机
 * @Author: xpy
 * @Date: Created in 2022年09月21日 4:30 下午
 */
public class IpcComputerBuilder {

    Computer computer;

    public IpcComputerBuilder() {
        this.computer = new Computer();
    }

    public IpcComputerBuilder buildCpu(String cpu) {
        computer.setCpu(cpu);
        return this;
    }

    public IpcComputerBuilder buildMainBoard(String mainBoard) {
        computer.setMainBoard("平板电脑主板");
        return this;
    }

    public IpcComputerBuilder buildMemory(String memory) {
        computer.setMemory("平板电脑内存");
        return this;
    }

    public Computer buildComputer() {
        return computer;
    }

    public static void main(String[] args) {
        Computer computer = new IpcComputerBuilder().buildCpu("工控机CPU").buildMainBoard("工控机主板").buildMemory("工控机内存").buildComputer();
    }
}

关注微信公众号「平哥技术站」, 每日更新,在手机上阅读所有教程,随时随地都能学习。

觉得写的还不错的小伙伴,请作者喝杯咖啡☕ ,支持一下。😊

如有侵权请立即与我们联系,我们将及时处理,联系邮箱:865934097@qq.com。

1

评论区