class Car {
seats: number;
engine: string;
color: string;
setSeats(seats: number) {
this.seats = seats;
}
setEngine(engine: string) {
this.engine = engine;
}
setColor(color: string) {
this.color = color;
}
}
class Manual {
seats: number;
engine: string;
color: string;
setSeats(seats: number) {
this.seats = seats;
}
setEngine(engine: string) {
this.engine = engine;
}
setColor(color: string) {
this.color = color;
}
}
interface CarBuilder {
reset(): this;
setSeats(seats: number): this;
setEngine(engine: string): this;
setColor(color: string): this;
// getResult(): any
}
class ConcreteCarBuilder implements CarBuilder {
private car: Car;
constructor() {
this.car = new Car();
}
reset() {
this.car = new Car();
return this;
}
setSeats(seats: number) {
this.car.setSeats(seats);
return this;
}
setEngine(engine: string) {
this.car.setEngine(engine);
return this;
}
setColor(color: string) {
this.car.setColor(color);
return this;
}
getResult() {
const result = this.car;
this.reset();
return result;
}
}
class ConcreteManualBuilder implements CarBuilder {
private manual: Manual;
constructor() {
this.manual = new Manual();
}
reset() {
this.manual = new Manual();
return this;
}
setSeats(seats: number) {
this.manual.setSeats(seats);
return this;
}
setEngine(engine: string) {
this.manual.setEngine(engine);
return this;
}
setColor(color: string) {
this.manual.setColor(color);
return this;
}
getResult() {
const result = this.manual;
this.reset();
return result;
}
}
class Director {
buildRedSportsCar(builder: Builder) {
builder
.reset() //
.setSeats(2) //
.setEngine("SportEngine")
.setColor("red");
}
// buildBlackSUV(builder: Builder) {
// builder
// .reset() //
// .setSeats(5) //
// .setEngine('Normal Engine')
// .setColor('black');
// }
}
function main() {
const director = new Director();
const carBuilder: CarBuilder = new ConcreteCarBuilder();
director.buildRedSportsCar(carBuilder);
const car: Car = carBuilder.getResult();
const manualBuilder: CarBuilder = new ConcreteManualBuilder();
director.buildRedSportsCar(manualBuilder);
const manual: Manual = manualBuilder.getResult();
}