@zlodiak

Конфликтует ли фабричный метод с OCP?

Скажите пожалуйста, правильно ли я понимаю, что принципы solid это не рецепт на все случаи? И вполне обычное явление - умышленное нарушение некоторых solid-принципов.

Например существует паттерн фабричный метод. Вот его реализация:
class Door:
    def __init__(self, weight):
        self.weight = weight

    def __str__(self):
        return str(self.weight)

class Brick:
    def __init__(self, weight):
        self.weight = weight

    def __str__(self):
        return str(self.weight)        

class FactoryMethod:
    def create(self, weight, type_):
        pass

class Creator(FactoryMethod):
    def create(self, type_, weight):
        if type_ == 'door':
            print('door with weight: ', Door(weight))
        else:
            print('brick with weight: ', Brick(weight))

c = Creator()
c.create('brick', 10)
c.create('door', 100)


Как видите, он нарушает один из принципов solid, а конкретно принцип открытости/закрытости. Если понадобится генерировать кроме дверей и кирпичей, ещё и окна, то придётся вносить изменения в метод Creator.create()

А принцип открытости/закрытости запрещает изменять написанный ранее код, он разрешает только добавлять новый.
  • Вопрос задан
  • 217 просмотров
Пригласить эксперта
Ответы на вопрос 2
@MechanicZelenyy
То что вы привели это не фабричный метод. А шаблон проектирования фабрика.

Фабричный метод - это статический (в питоне classmethod) который возвращает экземпляр класса.

Пример:

class Door:
    def __init__(self, weight):
        self.weight = weight

    def __str__(self):
        return str(self.weight)

# фабричный метод
    def door_from_window(cls, window):
        # какой-то код

door = Door.door_from_windwow(window)
Ответ написан
Комментировать
@EvgeniiR
https://github.com/EvgeniiR
Фабричный метод возвращает объекты одного типа, это даже показано в приведенной вами статье.
То есть, по хорошему, всё что должен знать клиентский код при вызове фабричного метода - объект с каким интерфейсом/экзмепляр какого абстрактного класса должен вернуться.

Кстати, совет, новички этим частенько грешат - не пытайтесь впихнуть паттерны в код, просто за то что они есть, и не пытайтесь изучить их чтобы улучшить качество своего кода. Это скорее названия наиболее часто повторяющихся мест в разных программах.
Если интересны паттерны, и вы хотите извлечь из этого пользу - старайтесь найти побольше примеров использования изучаемых на текущий момент, и разобраться почему были выбраны именно они. Вот там будет простор на подумать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы