编辑代码

// 定义一个 Car 类来表示汽车:
class Car {
    make: string;
    model: string;
    year: number;
    engine: string;
    transmission: string;

    constructor(make: string, model: string, year: number, engine: string, transmission: string) {
        this.make = make;
        this.model = model;
        this.year = year;
        this.engine = engine;
        this.transmission = transmission;
    }
}

// 定义一个建造者类来构建汽车。
// 建造者类将包含一个接口和一组方法,用于设置汽车的不同属性。
// 还需要定义一个具体的建造者类,它将实现建造者接口,并负责构建汽车。
interface CarBuilder {
    setMake(make: string): void;
    setModel(model: string): void;
    setYear(year: number): void;
    setEngine(engine: string): void;
    setTransmission(transmission: string): void;
    getResult(): Car;
}

class ConcreteCarBuilder implements CarBuilder {
    private car: Car;

    constructor() {
        this.car = new Car('', '', 0, '', '');
    }

    setMake(make: string) {
        this.car.make = make;
    }

    setModel(model: string) {
        this.car.model = model;
    }

    setYear(year: number) {
        this.car.year = year;
    }

    setEngine(engine: string) {
        this.car.engine = engine;
    }

    setTransmission(transmission: string) {
        this.car.transmission = transmission;
    }

    getResult() {
        return this.car;
    }
}


// 指导者类,负责控制建造者类的顺序和步骤,以构建汽车。
class CarDirector {
    private builder: CarBuilder;

    constructor(builder: CarBuilder) {
        this.builder = builder;
    }

    constructSportsCar() {
        this.builder.setMake('Porsche');
        this.builder.setModel('911');
        this.builder.setYear(2022);
        this.builder.setEngine('4.0L flat-six');
        this.builder.setTransmission('7-speed manual');
    }

    constructSUV() {
        this.builder.setMake('Toyota');
        this.builder.setModel('RAV4');
        this.builder.setYear(2022);
        this.builder.setEngine('2.5L inline-four');
        this.builder.setTransmission('8-speed automatic');
    }
}


const builder = new ConcreteCarBuilder();
const director = new CarDirector(builder);

director.constructSportsCar();
const sportsCar = builder.getResult();
console.log(sportsCar);

director.constructSUV();
const suv = builder.getResult();
console.log(suv);

// 建造者模式允许我们以一种清晰和简单的方式创建复杂对象,减少了对象构建的复杂性和重复性。