Назначение фабричных объектов / преимущество по сравнению с использованием того же экземпляра для возврата - PullRequest
3 голосов
/ 02 февраля 2010

В чем преимущество статического фабричного класса по сравнению с использованием экземпляра того же объекта для возврата этого объекта?

Например, из N2 CMS, посмотрите на этот код:

Новости в новостях = Factory.Persister.Get (itemID);

// Переменная для новостей может устанавливать свойства, связанные с новостями.

Factory.Persister.Save (новости);

Фабрика является статической, и я знаю, что делают / являются объектами фабрики, но я не вижу преимущества статической фабрики (которая, вероятно, берет на себя ответственность за установку различных типов) по сравнению с использованием объекта Newspage это.

Спасибо

Ответы [ 4 ]

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

Есть несколько преимуществ статической фабрики вместо использования конструктора:

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

  • Статические фабрики имеют названия; конструкторы нет. В большинстве языков ООП они обычно должны иметь то же имя, что и класс, и могут различаться только по типу и количеству аргументов. Но статические фабрики могут иметь разные имена, а также любой тип и количество аргументов.

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

  • С помощью статических фабрик вы можете контролировать и регулировать, какие объекты существуют в любой момент времени - не так уж много с new.

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

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

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

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

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

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

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

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

Одна школа мысли состоит в том, что если вы создаете объект и используете объект, то вы тесно связаны с этим объектом. Фабрика позволяет вам абстрагироваться от типа объекта на самом деле, чтобы вы не зависели от конкретного класса реализации. Например, что если в будущем Newpages нужно будет создавать из кэша Google, а не из источника NNTP? Вы хотите добавить новые конструкторы и логику во все места, где создаются газеты, или вы бы предпочли абстрагировать это в фабричном классе?

Тем не менее, я не думаю, что статическая фабрика - отличная идея. Как бы вы поменяли его с реализацией, которая возвращает поддельные объекты для целей модульного тестирования? Вы должны действительно изучить внедрение зависимостей, чтобы не привязываться к статическим объектам. Единственная статическая вещь, определяемая некоторыми работающими приложениями - это main ().

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