Вопрос в основном о дизайне.
Предположим, у нас есть класс, который играет роль инициации различных подклассов определенного типа по некоторым параметрам, через которые он итерирует.Проблема возникает, когда метод __init__
получает разные параметры для каждого подтипа.Есть ли способ избежать операторов if
внутри функции, которая инициализирует классы, просто чтобы знать, какие параметры передать?Может быть, какой-то шаблон дизайна, о котором я не знаю.Или это результат плохого дизайна?
ниже - пример того, что я имею в виду.обратите внимание на статический метод управления, в котором есть if ... else ... и если бы было больше типов работников, у нас было бы больше if, что я и стараюсь избегать.Имейте в виду, что пример минимален, и операторы if
могут быть гораздо более сложными.
from abc import ABCMeta
class BaseWorker(metaclass=ABCMeta):
def work(self):
pass
class Worker1(BaseWorker):
def __init__(self, name):
self.name = name
def work(self):
pass
class Worker2(BaseWorker):
def __init__(self, name, age):
self.name = name
self.age = age
def work(self):
pass
class Manager(object):
@staticmethod
def manage(attributes_list):
for attributes in attributes_list:
if "age" in attributes:
w = Worker2(name=attributes["name"], age=attributes["age"])
else:
w = Worker1(name=attributes["name"])
w.work()
if __name__ == '__main__':
dynamic_attributes = [
{"name": "davay"},
{"age": "55", "name": "ok"},
# and so on...
]
Manager.manage(dynamic_attributes)
И желаемое решение было бы
@staticmethod
def desired_manage(attributes_list):
for attributes in attributes_list:
w = worker_factory(attributes)
w.work()
** Обратите внимание, что worker_factory
- это просто произвольное название способа решения этой проблемы, это не означает, что фабричный шаблон - это путь.Даже меньше, если мы попробуем фабричный шаблон, из того, что я вижу, операторы if
просто переместятся туда и ничего не решат.
Спасибо!