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