AbstractFactory и принцип подстановки Лискова
Я работал над дизайном, который должен описывать поток данных. Структура потока всегда одна и та же, но каждый шаг в потоке имеет уникальную реализацию для каждого "типа". Как только мы выберем определенный "тип", он будет таким же для остальной части потока.
Моя первоначальная реализация заключалась в создании абстрактного класса для каждого шага:
class AbstractStep1(metaclass=ABCMeta):
@abstractmethod
def process(common_input) -> "AbstractStep1Output":
pass
class AbstractStep2(metaclass=ABCMeta):
@abstractmethod
def process(input: "AbstractStep1Output") -> "AbstractStep2Output":
pass
А затем создать конкретную реализацию для каждого типа:
class Type1Step1(AbstractStep1):
def process(common_input) -> "Type1Step1Output":
# implementation
class Type1Step2(AbstractStep2):
def process(input: "Type1Step1Output") -> "Type1Step2Output":
# implementation
Обратите внимание, что выходные данные каждого шага имеют определенный тип.
Потом я использовал mypy и получил много ошибок о нарушении "принципа подстановки Лискова". Читая об этом, я столкнулся с паттерном AbstractFactory. Это выглядело как хорошее совпадение, но потом я запутался в наследовании / интерфейсе. Даже если бы я создал абстрактную фабрику, которая создает все экземпляры шагов, какие типы я должен указать в сигнатурах функций шага?
С одной стороны, технологический метод Type1Step2
может работать только с выходом Type1Step1
, с другой стороны, изменение сигнатуры функции нарушает принцип подстановки Лискова.
Если бы я избавился от абстракции, что бы сохранило структуру шагов? Моя главная цель - иметь:
factory = Type1Factory()
step1 = factory.get_step_1()
step1_output = step1.process(common_input)
step2 = factory.get_step_2()
step2_output = step2.process(step1_output) # note that step2 of specific type can only work with step1_output of the SAME type
Любая помощь будет высоко ценится!
Спасибо