class Base: pass class First(Base): def somemethod(): # Specific to First class somemethod implementation pass class Second(Base): def somemethod(): # Specific to Second class somemethod implementation pass
В некоторую функцию передается один ключевой параметр - он определяет фактически объект какого класса потребуется, и параметры инициализации объекта. Я читал про фабричный метод но сейчас я его представляю его как то так:
class Base: def __init__(self, classid, params): if classid == "First": self.instance = First(params) if classif == "Second": self.instance = Second(params) def get_instance(): return self.instance class First(Base): def somemethod(): # Specific to First class somemethod implementation pass class Second(Base): def somemethod(): # Specific to Second class somemethod implementation pass InstanceOfRequiredClass = Base(classid, *params).get_instance()
Насколько я понял в терминологии паттернов проектирования таким образом реализованный конструктор класса Base называется фабричным методом. Так ли это ?
Решение проблемы описанное выше мне не нравится прежде всего наличием этого жуткого говнокода в виде ифов в __init__ методе. И каждый раз добавляя новый функционал я должен буду писать в этом методе новый иф. Вторая проблема никто не запрещает инстанциировать экземпляры First и Second не через конструирование Base. Как обойти названные проблемы ?