@startuml Patterns
interface CarFactory {
    + createEngine(): Engine
    + createTransmission(): Transmission
}

class GasolineCarFactory {
    + createEngine(): Engine
    + createTransmission(): Transmission
}

class ElectricCarFactory {
    + createEngine(): Engine
    + createTransmission(): Transmission
}

abstract class ManufacturingProcess {
    - productionLine: ProductionLine
    + fabricate(): void
    + assemble(): void
}

class EnginePartsManufacturingProcess {
    + EnginePartsManufacturingProcess(productionLine: ProductionLine)
    + fabricate(): void
    + assemble(): void
}

class TransmissionManufacturingProcess {
    + TransmissionManufacturingProcess(productionLine: ProductionLine)
    + fabricate(): void
    + assemble(): void
}

class CarMediator {
    - engine: Engine
    - transmission: Transmission
    + setEngine(engine: Engine): void
    + setTransmission(transmission: Transmission): void
}

interface Engine {
    + start(): void
    + stop(): void
}

class GasolineEngine {
    + start(): void
    + stop(): void
}

class ElectricEngine {
    + start(): void
    + stop(): void
}

interface Transmission {
    + shift(): void
}

class AutomaticTransmission {
    + shift(): void
}

class ManualTransmission {
    + shift(): void
}

class ProductionLine {
    + run(process: String): void
}

CarFactory <|.. GasolineCarFactory
CarFactory <|.. ElectricCarFactory
ManufacturingProcess <|-- EnginePartsManufacturingProcess
ManufacturingProcess <|-- TransmissionManufacturingProcess
CarMediator --* Engine
CarMediator --* Transmission
Engine <|.. GasolineEngine
Engine <|.. ElectricEngine
Transmission <|.. AutomaticTransmission
Transmission <|.. ManualTransmission
@enduml