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);