建造者模式

1. 定义

建造者模式(Bulider Pattern)是将一个复杂对象的构建过程与它的实现表示分离,使得同样的构建过程可以创建不同的表示,属于创建型模式。

这定义看着很懵,对吧,我形象的解答一下,那就是复杂对象的实现表示是可以抽象出一个共有逻辑的(比如车都有车门,车架,底盘),但是复杂对象的构建过程是各自的(赛车的底盘就低,SUV的底盘就高,各自的构建过程是不同的)。

建造者模式把最后的实现表示,和中间的构建过程分离开了。

说白了,一个建造者根据自己的逻辑建造一套产品,工程师根据不同的建造者得到对应的一套产品,根据表示逻辑进行表示。

这和抽象工厂模式对应上了,前面抽象工厂模式我们讲过,抽象工厂模式就是卖套餐,卖一系列产品。建造者在这儿就是一个卖套餐的,一个建造者有一系列产品,但是,这些散装的零件拿给消费者,消费者懵了啊,我要买车你给我这些干哈,我不会啊。所以需要有一个工程师,他说我的设定就是组装,所以工程师内部是复杂产品的表示逻辑。

2. 代码

依旧是这个车的例子,车有车门,车架,底盘,每个部位的对象都有一个属性value,一个抽象的Builder确定了构建车门,车架和底盘的逻辑。宝马和特斯拉两个Builder实现类各自都有自己的车门,车架和底盘的构建逻辑。一个工程师复杂车门、车架和底盘的表示逻辑(组装)。

车 Car:

public class Car {
    private Door door;
    private Frame frame;
    private BasePlate basePlate;

    public void setDoor(Door door) {
        this.door = door;
    }

    public void setFrame(Frame frame) {
        this.frame = frame;
    }

    public void setBasePlate(BasePlate basePlate) {
        this.basePlate = basePlate;
    }

    @Override
    public String toString() {
        return "Car{" +
                "door='" + door + '\'' +
                ", frame='" + frame + '\'' +
                ", basePlate='" + basePlate + '\'' +
                '}';
    }
}

车门 Door

public class Door {
    private String value;

    public Door() {
    }

    @Override
    public String toString() {
        return value;
    }

    public Door(String value) {
        this.value = value;
    }
}

车架 Frame

public class Frame {
    private String value;

    public Frame() {
    }

    @Override
    public String toString() {
        return value;
    }

    public Frame(String value) {
        this.value = value;
    }
}

底盘 BasePlate

public class BasePlate {
    private String value;

    public BasePlate() {
    }

    @Override
    public String toString() {
        return value;
    }

    public BasePlate(String value) {
        this.value = value;
    }
}

抽象的Builder

public abstract class Builder {

    public abstract Door buildDoor();

    public abstract Frame buildFrame();

    public abstract BasePlate buildBasePlate();
}

宝马Builder

public class BMWBuilder extends Builder{
    @Override
    public Door buildDoor() {
        return new Door("宝马自己的车门生产");
    }

    @Override
    public Frame buildFrame() {
        return new Frame("宝马自己的车架生产");
    }

    @Override
    public BasePlate buildBasePlate() {
        return new BasePlate("宝马自己的底盘生产");
    }
}

特斯拉Builder

public class TeslaBuilder extends Builder{
    @Override
    public Door buildDoor() {
        return new Door("特斯拉自己的车门生产");
    }

    @Override
    public Frame buildFrame() {
        return new Frame("特斯拉自己的车架生产");
    }

    @Override
    public BasePlate buildBasePlate() {
        return new BasePlate("特斯拉自己的底盘生产");
    }
}

工程师Engineer

public class Engineer {
    private Car car = new Car();

    public void make(Builder builder) {
        car.setDoor(builder.buildDoor());
        car.setFrame(builder.buildFrame());
        car.setBasePlate(builder.buildBasePlate());
        System.out.println("工程师已经完成了车的组装逻辑:" + car);
    }
}

测试代码

public class Test {
    public static void main(String[] args) {
        Engineer engineer = new Engineer();
//        Builder builder = new BMWBuilder(); //工程师已经完成了车的组装逻辑:Car{door='宝马自己的车门生产', frame='宝马自己的车架生产', basePlate='宝马自己的底盘生产'}
        Builder builder = new TeslaBuilder();//工程师已经完成了车的组装逻辑:Car{door='特斯拉自己的车门生产', frame='特斯拉自己的车架生产', basePlate='特斯拉自己的底盘生产'}

        engineer.make(builder);
    }
}

你可能感兴趣的:(设计模式,建造者模式,java)