Когда следует использовать заводской шаблон? - PullRequest
4 голосов
/ 22 июня 2009

Как и в заголовке, когда в вашей голове должен сработать триггер, означающий «Ага! Я должен использовать здесь фабричный шаблон!»? Я считаю, что эти моменты будут происходить со многими другими шаблонами проектирования, но я никогда не останавливаюсь и не думаю об этом шаблоне.

Ответы [ 6 ]

4 голосов
/ 22 июня 2009

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

IFoo obj;
if ( someCondition ) {
   obj = new RegularFoo();
} else if ( otherCondition ) {
   obj = new SpecialFoo();
} else {
   obj = new DefaultFoo();
}
4 голосов
/ 22 июня 2009

Цитируется из GoF :

Используйте шаблон Factory Method, когда

  • класс не может предвидеть класс объектов, которые он должен создать
  • класс хочет, чтобы его подклассы указали объект, который он создает
  • классы делегируют ответственность одному из нескольких вспомогательных подклассов, и вы хотите локализовать сведения о том, какой вспомогательный подкласс является делегатом.

Я настоятельно рекомендую книгу GoF. В нем есть раздел о применимости каждого из 23 шаблонов, которые он охватывает.

4 голосов
/ 22 июня 2009

Заводской шаблон лучше всего использовать в ситуациях, когда вы хотите инкапсулировать создание экземпляров группы объектов внутри метода.

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

3 голосов
/ 22 июня 2009

Я могу вспомнить два конкретных случая, которые я думаю о фабричном образце:

  • Когда в конструкторе есть логика.
  • Когда я не хочу, чтобы приложение беспокоилось о том, какой тип создается (например, у меня есть абстрактный базовый класс или интерфейс, который я возвращаю).
1 голос
/ 22 июня 2009

Вы говорите о фабричном методе или абстрактной фабрике?

Основная проблема, которую решают оба - позволить клиентам указывать точный класс, который конструирует код фреймворка. Например, если вы предоставляете интерфейс, который могут реализовать клиенты, а затем в вашем коде есть что-то вроде:

IMyInterface x = new ConcreteClass();

Клиенты не могут изменить точный класс, созданный без доступа к этому коду.

Фабричный метод - это виртуальный метод, который создает конкретный класс определенного интерфейса. Клиенты вашего кода могут предоставить объект, который переопределяет этот метод, чтобы выбрать класс, который вы хотите создать. Это может выглядеть так в вашем коде:

IMyInterface x = factory.Create();

factory передан клиентом и реализует интерфейс, который содержит Create () - они могут определить точный класс.

Абстрактная фабрика должна использоваться, если у вас есть иерархия связанных объектов и вам нужно писать код, который взаимодействует только с базовыми интерфейсами. Абстрактная фабрика содержит несколько фабричных методов, которые создают конкретные конкретные объекты из каждой иерархии.

В книге «Банды четырех» Design Patterns они приводят пример лабиринта с комнатами, стенами и дверями. Код клиента может выглядеть так:

IRoom r = mazeFactory.CreateRoom();
IWall nw = mazeFactory.CreateWall();
IWall sw = mazeFactory.CreateWall();
IWall ew = mazeFactory.CreateWall();
IWall ww = mazeFactory.CreateWall();
r.AddNorthWall(nw);
r.AddSouthWall(sw);
r.AddEastWall(ew);
r.AddWestWall(ww);

(и т. Д.)

Точные бетонные стены, комнаты, двери могут быть определены разработчиком mazeFactory, который будет реализовывать предоставленный вами интерфейс (IMazeFactory).

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

0 голосов
/ 22 июня 2009

Фабрики часто используются в локализации, где у вас есть экран с различными макетами, подсказками и внешним видом для каждого рынка. Вы получаете Screen Factory для создания экрана на основе вашего языка, и он создает соответствующий подкласс на основе своего параметра.

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