Как вы создаете свои фабрики? - PullRequest
3 голосов
/ 02 февраля 2010

Итак, что касается вопроса о фабриках, мне интересно, как они устроены.

С того места, где я стою, я вижу 3 типа фабрик:

Все в одном

Фабрика, которая в основном содержит все классы, используемые в приложении. Такое ощущение, что это просто фабрика ради фабрики, и на самом деле она не чувствует себя структурированной.

Пример (где ClassA, Class B и ClassC не имеют ничего общего, кроме того, что находятся в одном приложении) :

class Factory
{
 public static function buildClassA()
 public static function buildClassB()
 public static function buildClassC()
}

Примеры кода приведены на PHP. Однако этот вопрос не зависит от языка.

Встроенный завод

Следующий - смешивание статических функций с обычными функциями для создания специальных шаблонов создания (см. этот вопрос )

Пример:

class ClassA
{
 public static function buildClass()
 public function __construct()
}

Заводская установка

Последнее, о чем я могу думать, - это фабрика для отдельных классов или отдельных наборов классов. Это просто переменная, которая будет использоваться единообразно.

Пример (где класс A, B и C связаны, а 1, 2 и 3 связаны):

class FactoryAlpha
{
 public static function buildClassA()
 public static function buildClassB()
 public static function buildClassC()
}

class FactoryNumeric
{
 public static function buildClass1()
 public static function buildClass2()
 public static function buildClass3()
}

Мой вопрос: все ли это плохие идеи, являются ли они какими-то плохими идеями? Есть ли другие способы создания фабрик? Любая из этих действительно хороших идей? Что такое хороший / лучший способ создать фабрики.

Ответы [ 3 ]

5 голосов
/ 02 февраля 2010

Смысл фабрики, похоже, в том, что у кода, который ее использует, нет необходимости знать, какой конкретный класс будет создан (это должно быть обработано путем настройки фабрики). Похоже, это исключает "все в одном" и "Фабрика на стороне".

Мне нравится подход, который часто используют библиотеки Java: у вас есть статический метод, который создает Factory. Фабрика имеет метод getInstance, который создает экземпляр. Это дает вам две точки конфигурации (через системные свойства): FactoryImpl по умолчанию имеет ряд настроек, например, класс, который он должен создать, и если этих параметров конфигурации недостаточно, вы также можете полностью поменять FactoryImpl.

Что касается «All-in One» против «Фабрики на стороне», то Фабрика не должна производить несвязанные классы, я думаю. Опять же, это термины Java, каждая фабрика создает экземпляры определенного интерфейса.

«Все в одном» звучит как нечто, что должно быть заменено на Dependency Injection (где у вас есть контейнер, который создает всевозможные экземпляры и внедряет их в приложение).

2 голосов
/ 02 февраля 2010

Если вас действительно интересуют «Предпочитаемые технологии», я бы заменил их всех на Dependency Injection.

Если это кажется тяжелым, просто помните, что вы, возможно, не видите каждого использования для своей фабрики, так что не создавайте жестко закодированный класс на своей фабрике. Вместо этого имейте «Setter», который может указать, какой класс должен быть введен.

Это пригодится позже, когда вы будете тестировать модули и вам нужно начать вводить фиктивные классы.

Но если вы сделаете это более общим, абстрактным и пригодным для повторного использования, вы снова окажетесь в DI. (Только не говори, что я тебя не предупреждал)

0 голосов
/ 02 февраля 2010

На самом деле есть только два стандартных вида заводов, по крайней мере, согласно GOF и убиванию из шаблонов книг, за которыми следовали Основная Фабрика и Абстрактная Фабрика .

Фабрика обычно возвращает конкретный экземпляр, на который ссылается вызывающая сторона, через интерфейс, например:

// createWidget() here instantiates a BigWidget or SmallWidget or whatever the context calls for
IWidget widget = WidgetFactory.createWidget(someContextValue);

Использование таким способом фабрики с интерфейсом не позволяет вызывающей стороне быть связанной с определенным типом возвращаемого объекта. Следуя почтенному принципу единой ответственности , фабрика должна сделать одну вещь, то есть вернуть конкретный экземпляр интерфейса, который был вызван, и ничего более. Базовая фабрика должна создавать только один тип объекта.

Абстрактная фабрика, с другой стороны, может рассматриваться как фабрика фабрик и может быть ближе к тому, о чем вы думали как фабрика «все в одном». Абстрактная фабрика обычно конфигурируется при запуске, чтобы возвращать группу связанных фабрик, например, фабрик, которые могут создавать определенное семейство графических интерфейсов в зависимости от заданного контекста. Это пример инверсии зависимости , которая в значительной степени была заменена использованием контейнеров IOC, таких как Spring .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...