设计模式——建造者模式

        建造者模式也是我要分享的最后一种创建型模式,创建型模式还有单例模式、原型模式、工厂方法模式、抽象工厂模式,这些模式都在前面分享过了,有兴趣的同学可以往前面翻翻。

        好了,下面进入正题。

        建造者模式既然属于创建型模式,那么他就也是用来创建对象的,并且它是用来创建相对复杂点的对象,该类对象可以拆分成很多个部分。比如,一台主机是由CPU、主板、内存、硬盘、显卡、机箱等等组成,每个部位你都可以选取你想要的配置,最终组成你所需求的主机。

        建造者模式有四个主要角色:

(1)产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个组成部件。
(2)抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法getResult()。
(3)具体建造者(Concrete Builder):实现Builder接口,完成复杂产品的各个部件的具体创建方法。
(4)指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

四个角色的关系图:

此图参考《软件设计模式》

 

下面上代码来分别诠释这几个主角。

1.产品角色

在这个例子中,产品角色就是电脑了。

package builder;

import lombok.Data;
import lombok.ToString;

@Data
@ToString
public class Computer {
    /**
     * cpu
     */
    private String cpu;
    /**
     * 内存
     */
    private String ram;
    /**
     * 显卡
     */
    private String gpu;
    /**
     * 硬盘
     */
    private String disk;
}

2.抽象建造者

package builder;

public abstract class AbstractComputerBuilder {
    public Computer computer = new Computer();

    abstract void builderCPU();

    abstract void builderRam();

    abstract void builderGPU();

    abstract void builderDisk();

    public Computer getComputer() {
        return computer;
    }
}

3.具体建造者

这里我暂且先定义俩种

package builder;

/**
 * 华为电脑建造器
 */
public class HWComputerBuilder extends AbstractComputerBuilder{
    @Override
    void builderCPU() {
        super.computer.setCpu("华为CPU");
    }

    @Override
    void builderRam() {
        super.computer.setRam("华为Ram");
    }

    @Override
    void builderGPU() {
        super.computer.setGpu("华为GPU");
    }

    @Override
    void builderDisk() {
        super.computer.setDisk("华为硬盘");
    }

    @Override
    public Computer getComputer() {
        return super.getComputer();
    }
}

package builder;

/**
 * 小米电脑建造器
 */
public class MiComputerBuilder extends AbstractComputerBuilder{
    @Override
    void builderCPU() {
        super.computer.setCpu("小米CPU");
    }

    @Override
    void builderRam() {
        super.computer.setRam("小米Ram");
    }

    @Override
    void builderGPU() {
        super.computer.setGpu("小米GPU");
    }

    @Override
    void builderDisk() {
        super.computer.setDisk("小米硬盘");
    }

    @Override
    public Computer getComputer() {
        return super.getComputer();
    }
}

4.指挥者

package builder;

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class ComputerManager {
    private AbstractComputerBuilder computerBuilder;

    /**
     * 组装电脑
     * @return 电脑
     */
    public Computer builderComputer(){
        computerBuilder.builderCPU();
        computerBuilder.builderRam();
        computerBuilder.builderGPU();
        computerBuilder.builderDisk();
        return this.computerBuilder.getComputer();
    }
}

写个用例测试下:

package builder;

public class start {
    public static void main(String[] args) {
        //构造小米电脑
        MiComputerBuilder miComputerBuilder = new MiComputerBuilder();
        ComputerManager computerManager = new ComputerManager(miComputerBuilder);
        System.out.println(computerManager.builderComputer().toString());
        //构造华为电脑
        HWComputerBuilder hwComputerBuilder = new HWComputerBuilder();
        ComputerManager computerManager1 = new ComputerManager(hwComputerBuilder);
        System.out.println(computerManager1.builderComputer().toString());
    }
}

运行结果如下:

 通过上面代码,我们可以看出建造一个产品,我们不需要知道产品是怎么组装的,我们只需要整个合适的模板,交给组装的人就能得到我们想要的产品。

        JAVA源码中有典型的建造者模式使用者,java.lang.StringBuilder/java.lang.StringBuffer,看下StringBuilder结构

 感兴趣的同学可以去看看源码。

        分享是种乐趣~~~修BUG也是

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

·码上修·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值