Factory method

by Artem

TypeScript

interface Venichle {
    setColor(rgb: string): void;
    getColor(): string;
}

abstract class VenichleFactory {
    protected abstract createVenichle()
    public create() {
        const venichle = this.createVenichle();
        venichle.setColor('black');
        return venichle;
    }
}

class GermanFactory extends VenichleFactory {
    public createVenichle() {
        const carMercedes = new Mercedes();
        carMercedes.addAMGTuning();
        return carMercedes;
    }
}

class Mercedes implements Venichle {
    private color;

    public setColor(rgb) {
        this.color = rgb;
    }

    public getColor() {
        return this.color;
    }

    public addAMGTuning() {

    }
}

class Italian extends VenichleFactory {
    public createVenichle() {
        const carFerrari = new Ferrari();
        return carFerrari;
    }
}

class Ferrari implements Venichle {
    private color;

    public setColor(rgb) {
        this.color = rgb;
    }

    public getColor() {
        return this.color;
    }
}

const factory = new GermanFactory();
const carMercedes: Venichle = factory.create();