设计模式之建造者模式

1、建造者模式介绍

建造者模式通过将多个简单的对象一步步组装构建成一个复杂对象的过程,将一个复杂的构建与其表示分离,使得同样的构建过程可以创建不同的表示。

2、案例场景模拟

购买不同的家用电器,不同的组合会有不同的方案,通过家用电器方案的选择组合来达到模拟建造者模式使用过程。

3、代码实现

3.1、代码工程目录
在这里插入图片描述
3.2、代码实现
3.2.1、电器接口

  • 电器接口提供了基本的电器信息
public interface Device {

    //类型:风扇、空调、洗衣机
    String type();

    //品牌
    String brand();

    //型号
    String model();

    //价格
    BigDecimal price();

}

3.2.2、家用电器实现

  • 风扇一
public class DeviceFanOne implements Device {

    @Override
    public String type() {
        return "风扇";
    }

    @Override
    public String brand() {
        return "格力";
    }

    @Override
    public String model() {
        return "FO1";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(1999);
    }
}
  • 风扇二
public class DeviceFanTwo implements Device {

    @Override
    public String type() {
        return "风扇";
    }

    @Override
    public String brand() {
        return "小米";
    }

    @Override
    public String model() {
        return "FO2";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(199);
    }
}
  • 空调一
public class DeviceAirConditioningOne implements Device {

    @Override
    public String type() {
        return "空调";
    }

    @Override
    public String brand() {
        return "格力";
    }

    @Override
    public String model() {
        return "AO1";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(99);
    }
}
  • 空调二
public class DeviceAirConditioningTwo implements Device {

    @Override
    public String type() {
        return "空调";
    }

    @Override
    public String brand() {
        return "小米";
    }

    @Override
    public String model() {
        return "AO2";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(999);
    }
}
  • 洗衣机一
public class DeviceWashingMachineOne implements Device {

    @Override
    public String type() {
        return "洗衣机";
    }

    @Override
    public String brand() {
        return "格力";
    }

    @Override
    public String model() {
        return "WO1";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(799);
    }
}
  • 洗衣机二
public class DeviceWashingMachineTwo implements Device {

    @Override
    public String type() {
        return "洗衣机";
    }

    @Override
    public String brand() {
        return "小米";
    }

    @Override
    public String model() {
        return "WO2";
    }

    @Override
    public BigDecimal price() {
        return new BigDecimal(1299);
    }
}

3.2.3、家用电器方案接口及实现

  • 定义家用电器方案接口
public interface IHouseDevice {

    //购买风扇
    IHouseDevice BuyFan(Device device);

    //购买空调
    IHouseDevice BuyAirConditioning(Device device);

    //购买洗衣机
    IHouseDevice BuyWashingMachine(Device device);

    //总价
    BigDecimal getTotalPrice();

    //购买明细
    String getDetail();
}
  • 方案接口实现
public class HouseDeviceDetail implements IHouseDevice {

    //总价
    private BigDecimal price = BigDecimal.ZERO;
    private List<Device> deviceList = new ArrayList<>();

    @Override
    public IHouseDevice BuyFan(Device device) {
        price = price.add(device.price());
        deviceList.add(device);
        return this;
    }

    @Override
    public IHouseDevice BuyAirConditioning(Device device) {
        price = price.add(device.price());
        deviceList.add(device);
        return this;
    }

    @Override
    public IHouseDevice BuyWashingMachine(Device device) {
        price = price.add(device.price());
        deviceList.add(device);
        return this;
    }

    @Override
    public BigDecimal getTotalPrice() {
        return price;
    }

    @Override
    public String getDetail() {
        StringBuilder detail = new StringBuilder();
        for (Device device : deviceList) {
            detail.append("类型:").append(device.type()).append(", 品牌:").append(device.brand()).append(",型号:")
                    .append(device.model()).append("价格:").append(device.price()).append("\n");
        }
        return detail.toString();
    }
}

3.2.4、建造者代码实现

public class Builder {

    //方案一
    public IHouseDevice planOne() {
        return new HouseDeviceDetail().BuyFan(new DeviceFanOne()).BuyAirConditioning(new DeviceAirConditioningOne()).BuyWashingMachine(new DeviceWashingMachineOne());
    }

    //方案二
    public IHouseDevice planTwo() {
        return new HouseDeviceDetail().BuyFan(new DeviceFanTwo()).BuyAirConditioning(new DeviceAirConditioningOne()).BuyWashingMachine(new DeviceWashingMachineOne());
    }

    //方案三
    public IHouseDevice planThree() {
        return new HouseDeviceDetail().BuyFan(new DeviceFanTwo()).BuyAirConditioning(new DeviceAirConditioningTwo()).BuyWashingMachine(new DeviceWashingMachineOne());
    }

    //方案四
    public IHouseDevice planFour() {
        return new HouseDeviceDetail().BuyFan(new DeviceFanOne()).BuyAirConditioning(new DeviceAirConditioningTwo()).BuyWashingMachine(new DeviceWashingMachineTwo());
    }
}

4、测试验证

  • 测试代码实现
public class BuilderTest {

    public static void main(String[] args) {

        Builder builder = new Builder();
        //方案一
        IHouseDevice one = builder.planOne();
        System.out.println("方案一价格:" + one.getTotalPrice() + ",明细:" + one.getDetail());

        //方案二
        IHouseDevice two = builder.planTwo();
        System.out.println("方案二价格:" + two.getTotalPrice() + ",明细:" + two.getDetail());

        //方案三
        IHouseDevice three = builder.planThree();
        System.out.println("方案三价格:" + three.getTotalPrice() + ",明细:" + three.getDetail());

        //方案四
        IHouseDevice four = builder.planOne();
        System.out.println("方案四价格:" + four.getTotalPrice() + ",明细:" + four.getDetail());
    }
}
  • 测试结果
    在这里插入图片描述

5、总结

  • 对于一些基本组件不会变但是组合经常变化时就可以通过建造者模式来构建代码;
  • 建造者模式满足单一职责原则及可复用的技术,建造者独立、易扩展。

微信公众号

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值