from abc import ABCMeta, abstractmethod
class IAuto(metaclass=ABCMeta):
@abstractmethod
def start(self):
pass
@abstractmethod
def stop(self):
pass
class IFactory(metaclass=ABCMeta):
@abstractmethod
def create_auto(self):
pass
class Tesla(IAuto):
def __init__(self, car_name):
self._carname = car_name
def start(self):
print(f"{self._carname} barely makes any noise.")
def stop(self):
print(f"{self._carname} stops within moments")
class TeslaFactory(IFactory):
def create_auto(self):
self.tesla = Tesla('Tesla Model S')
return self.tesla
class DodgeSRT(IAuto):
def __init__(self, car_name):
self._carname = car_name
def start(self):
print(f"{self._carname} Growls")
def stop(self):
print(f"{self._carname} Screeches to a stop!")
class DodgeFactory(IFactory):
def create_auto(self):
self.dodge_srt = DodgeSRT('Dodge SRT')
return self.dodge_srt
class NullCar(IAuto):
def __init__(self, car_name):
self._carname = car_name
def start(self):
print(f'Unknown Vehichle {self._carname}')
def stop(self):
print(f'Vehicle Stopped')
class NullFactory(IFactory):
def create_auto(self):
self.null_car = NullCar('')
return self.null_car
class AutoFactory():
autos = {}
def __init__(self):
self.load_autos()
def load_autos(self):
self.autos.update([[Tesla.__name__, Tesla],
[DodgeSRT.__name__, DodgeSRT],
[NullCar.__name__, NullCar]]);
def create_instance(self, car_name):
if car_name in self.autos:
return self.autos[car_name](car_name)
else:
return self.autos['NullCar'](car_name)
factory = AutoFactory()
for car_name in 'DodgeSRT', 'Tesla', 'Chevrolet':
car = factory.create_instance(car_name)
car.start()
car.stop()
print('----------------')
DodgeSRT Growls DodgeSRT Screeches to a stop! ---------------- Tesla barely makes any noise. Tesla stops within moments ---------------- Unknown Vehichle Chevrolet Vehicle Stopped ----------------
class FactoryManager():
factories = {}
def __init__(self):
self.load_factories()
def load_factories(self):
self.factories.update([[TeslaFactory.__name__, TeslaFactory],
[DodgeFactory.__name__, DodgeFactory],
[NullFactory.__name__, NullFactory]]);
def create_factory(self, factory_name):
if factory_name in self.factories:
return self.factories[factory_name]()
else:
return self.factories['NullFactory']()
factory_manager = FactoryManager()
for factory_name in 'DodgeFactory', 'TeslaFactory', 'ChevroletFactory':
factory = factory_manager.create_factory(factory_name)
car = factory.create_auto()
car.start()
car.stop()
print('----------------')
Dodge SRT Growls Dodge SRT Screeches to a stop! ---------------- Tesla Model S barely makes any noise. Tesla Model S stops within moments ---------------- Unknown Vehichle Vehicle Stopped ----------------