2015-02-01 5 views
0

Я использую для создания Singletons для реализации глобального состояния общего доступа, и я читаю о том, как синглтоны не проверяются и что вместо этого следует использовать шаблон Factory. Проблема, с которой я сталкиваюсь, заключается в том, что я не вижу, где было бы хорошим местом для создания объекта Factory, чтобы он был доступен везде.Где инициализировать объект Factory?

Большинство онлайн-образцов шаблона Factory показывают создание объекта в методе Main. Я программирую в контексте веб-приложения, которое упаковано в WAR.

Например, допустим, что у меня есть ServletA и ServletB. ServletA создает экземпляр FactoryClass, но когда вызывается ServletB, он не будет иметь доступ к экземпляру FactoryClass.

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

+0

Может ли ваша фабрика иметь статический метод/s? –

ответ

0

Я думаю, что вы столкнулись с двумя проблемами здесь. Сначала собирается инкапсулировать ответственность за создание объекта, чтобы следовать принципу DRY (вместо повторения экземпляра определенного класса по всему месту) и Factory pattern позволяет вам выполнить это. Второй относится к заполнению зависимостей в ваших классах и представляет собой более сложную проблему, но позволяет создавать более разделенный код.

Если ваше приложение прост (и я имею в виду очень простой), создание фабричных экземпляров в каждом классе, в котором он нуждается, будет удовлетворительным. Второй вариант (если у вас много фабрик и целевых объектов) будет создавать какой-то сервисный локатор, поэтому классы, которые нуждаются в некоторой зависимости, будут «запрашивать» его через выделенный метод. Третий способ (и, на мой взгляд, самый правильный) - вы должны использовать Dependency Injection, который предоставляет вам внешний механизм для «инъекции» экземпляров в ваши объекты. Таким образом, ваш код очень надежный, инкапсулированный и читаемый. С другой стороны, это требует использования некоторых фреймворков, которые реализуют DI как Spring или PicoContainer/NanoContainer и т. Д. Более подробная информация о концепции DI и IoC вы можете прочитать в большой статье here

+0

Спасибо. Я надеялся иметь только один экземпляр фабрики, который можно было бы использовать в приложении, иначе, когда я создаю экземпляр фабрики, ему нужно будет настраивать себя каждый раз. – Jay

+0

Таким образом, фабрика должна быть экземпляром [Singleton] (http://en.wikipedia.org/wiki/Singleton_pattern) или службой, предоставленной экземпляром Service Locator или инъецированной механизмом впрыскивания зависимостей, с использованием, например, аннотаций компонентов и Autwired Spring (или в xml config, который немного сложнее). В любом случае это зависит от ваших требований и масштабов вашего приложения. Лично я использую в основном Spring и DI с аннотациями. –

+0

Я пытался избежать использования Singleton, но на самом деле это выглядит как лучшее решение для моего приложения. благодаря – Jay

Смежные вопросы