Класс-фабрика в python

Рейтинг: 0Ответов: 1Опубликовано: 04.10.2014

Вот есть у меня вот такой занятный класс-фабрика:

class Fabric(object):
    def __init__(self):
        super(Fabric, self).__init__()
        self.queue = deque()

    def DoActionOne(self):
        print "one"

    def DoActionTwo(self):
        print "two"

    def AddActionToQueue(self, action):
        pass

    def ExecuteActonsFromQueue(self):
        pass

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

Есть ли какое-нибудь изящное решение данной проблемы?

Ответы

▲ 1

@Montreal, я так понял, вы хотите отделить логику создания класса (вызовы методов, сеттеров, аргументы конструктора) отделить от конструктора и, эм, места создания класса. В этом случае могу порекомендовать посмотреть, как это сделано в Symfony:

  • Есть общий контейнер-билдер; фабрикой его, наверное, сложно назвать, потому что он понятия не имеет, что производит (да и не сказать, что производит в классическом смысле - сохраняет в себе), кроме того, что это сервисы-одинчоки.
  • Есть типовые действия с инстансом свежесозданного класса - arguments (аргументы для передачи в конструктор, можно ссылаться на другие сервисы в контейнере), calls - вызовы методов, которые должны вызваны после создания класса, properties - список свойств, которые должны быть проставлены после создания.
  • Это позволяет один раз конфиг-файлом задать конфигурацию контейнера и забыть про него, позволяя доставать из него сервисы с помощью lazy load.

В вашем случае можно реализовать аналогичную штуковину, которая, правда, будет воспринимать параметры конфига не как сервисы-одиночки, а просто как конфигурацию создания класса, и создавать их при каждом обращении. Или просто добавить в конфиг флаг, который будет делить классы на создаваемые каждый раз и на сервисы. А при наличи аргументов, которые высчитываются только в рантайме, можно добавить еще один ключ конфига, который эти самые методы будет помечать как "передаваемые в рантайме" и требовать их при создании.