建造者模式

介绍

将一个复杂对象的创建与其表示先分离,同样的创建过程可以创建不同的表示。

主要解决: 当系统需要创建一个复杂的对象时,这个对象的各个子对象通常由一定的算法构成,由于需求的变化,各个子对象经常会有很大的变化,但是将它们组合在一起的算法却是稳定的。

何时使用:

  1. 需要创建一个具有复杂内部结构的对象时,这些内部组件基本不会变,但其组合经常变化的时候
  2. 需要生成的对象内部属性本身相互依赖

主要优点:

  1. 建造者独立,容易扩展

  2. 便于控制细节风险

实现示例

一个电脑由CPU、显卡、内存、主板、电源等组件组成,你是一个卖电脑的老板,需要根据客户不同的需求组建不同的电脑,那此时可以使用建造者模式实现。

电脑

class Computer{
    private String cpu;
    private String memory;
    private String displayCard;
    private String powerSource;
    private String mainBoard;
    private String fan;
    private String networkCard;

    public String getCpu() {
        return cpu;
    }

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

    public String getMemory() {
        return memory;
    }

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

    public String getDisplayCard() {
        return displayCard;
    }

    public void setDisplayCard(String displayCard) {
        this.displayCard = displayCard;
    }

    public String getPowerSource() {
        return powerSource;
    }

    public void setPowerSource(String powerSource) {
        this.powerSource = powerSource;
    }

    public String getMainBoard() {
        return mainBoard;
    }

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

    public String getFan() {
        return fan;
    }

    public void setFan(String fan) {
        this.fan = fan;
    }

    public String getNetworkCard() {
        return networkCard;
    }

    public void setNetworkCard(String networkCard) {
        this.networkCard = networkCard;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", memory='" + memory + '\'' +
                ", displayCard='" + displayCard + '\'' +
                ", powerSource='" + powerSource + '\'' +
                ", mainBoard='" + mainBoard + '\'' +
                ", fan='" + fan + '\'' +
                ", networkCard='" + networkCard + '\'' +
                '}';
    }
}

电脑建造者

final class ComputerBuilder{
    private final Computer computer;

    private ComputerBuilder(Computer computer) {
        this.computer = computer;
    }

    public static ComputerBuilder getComputerBuilder(){
        return new ComputerBuilder(new Computer());
    }

    public Computer build(){
        return this.computer;
    }

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

    public ComputerBuilder setMemory(String memory) {
        this.computer.setMemory(memory);
        return this;
    }

    public ComputerBuilder setDisplayCard(String displayCard) {
        this.computer.setDisplayCard(displayCard);
        return this;
    }

    public ComputerBuilder setPowerSource(String powerSource) {
        this.computer.setPowerSource(powerSource);
        return this;
    }

    public ComputerBuilder setMainBoard(String mainBoard) {
        this.computer.setMainBoard(mainBoard);
        return this;
    }

    public ComputerBuilder setFan(String fan) {
        this.computer.setFan(fan);
        return this;
    }

    public ComputerBuilder setNetworkCard(String networkCard) {
        this.computer.setNetworkCard(networkCard);
        return this;
    }

}

使用

public class BuilderPattern {

    public static void main(String[] args) {
        ComputerBuilder computerBuilder = ComputerBuilder.getComputerBuilder();
        computerBuilder.setCpu("牙膏厂")
                .setDisplayCard("败家眼")
                .setMemory("三星")
                .setPowerSource("长城");
        boolean needFan = false;
        boolean needNetworkCard = true;
        if(needFan){
            computerBuilder.setFan("猫头鹰最强风冷");
        }
        if(needNetworkCard){
            computerBuilder.setNetworkCard("千兆网卡直接起飞");
        }
        computerBuilder.setMainBoard("华硕主板");

        Computer computer = computerBuilder.build();
        System.out.println("成品电脑:" + computer.toString());
    }

}
/*结果:
成品电脑:Computer{cpu='牙膏厂', memory='三星', displayCard='败家眼', powerSource='长城', mainBoard='华硕主板', fan='null', networkCard='千兆网卡直接起飞'}
*/

源码应用

org.springframework.beans.factory.support.BeanDefinitionBuilder
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cuidianjay

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

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

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

打赏作者

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

抵扣说明:

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

余额充值