建造者模式

建造者模式

使命

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

主要解决在软件系统中,有时候面临着”一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

优点
  • 拓展性好
  • 细节把控方便
缺点
  • 建造产品必须要有共同点,范围有限制
  • 内部复杂,类衍生迅速

老生常谈,继续聊回我们的造车故事,最近造车厂提供了些定制化服务,让客户可以自定义选配各种配件,我们来看看,这是怎么实现的

汽车部件

public interface Item {

    String name();

    float price();

}

引擎部件

public interface Engine extends Item {

}

V6引擎

public class V6Engine implements Engine {

    @Override
    public String name() {
        return "V6引擎";
    }

    @Override
    public float price() {
        return 3_5000.99f;
    }
}

V12引擎

public class V12Engine implements Engine {

    @Override
    public String name() {
        return "V12引擎";
    }

    @Override
    public float price() {
        return 12_0000f;
    }
}

配色部件

public interface Color extends Item {

}

蓝色

public class ColorBlue implements Color {

    @Override
    public String name() {
        return "蓝色配色";
    }

    @Override
    public float price() {
        return 3000f;
    }
}

红色

public class ColorRed implements Color {

    @Override
    public String name() {
        return "红色配色";
    }

    @Override
    public float price() {
        return 2000f;
    }
}

汽车

public class Car {
    private String name;
    private List<Item> items = new LinkedList<>();

    public void setName(String name) {
        this.name = name;
    }

    /**
     * 添加汽车配件
     *
     * @param item
     */
    public void addItem(Item item) {
        items.add(item);
    }

    public String getInfo() {
        String allItem = "";
        float price = 0.0f;
        for (Item item : items) {
            allItem += item.name() + " ";
            price += item.price();
        }
        return name + " 的所有部件为:" + allItem + " 价格为: " + price;
    }
}

汽车建造者

public class CarBuilder {

    public Car getV6RedCar() {
        Car v6 = new Car();
        v6.setName("红魔");
        Item engine = new V6Engine();
        Item red = new ColorRed();
        v6.addItem(engine);
        v6.addItem(red);
        return v6;
    }

    public Car getV12BlueCar() {
        Car v12 = new Car();
        v12.setName("蓝军");
        Item engine = new V12Engine();
        Item red = new ColorBlue();
        v12.addItem(engine);
        v12.addItem(red);
        return v12;
    }
}

客户开始选择定制化车辆

public static void main(String[] args) {
    CarBuilder builder = new CarBuilder();
    Car v6 = builder.getV6RedCar();
    Car v12 = builder.getV12BlueCar();

    System.out.println(v6.getInfo());

    System.out.println(v12.getInfo());
}

和工厂模式对比,工厂模式更注重整体的生产,而建造者模式更注重细节把控,后者会更灵活,但是也会是整体架构复杂化,这两者是针对不同的场景,切勿混淆使用。