Почему метод getInstance () в шаблоне Factory должен быть статическим? - PullRequest
7 голосов
/ 13 сентября 2011

В большинстве реализаций шаблонов фабрики метод getInstance имеет значение , обычно , объявленное как статическое.Основным преимуществом фабричного шаблона является скрытие деталей реализации, но почему метод getInstance() должен быть статическим?Является ли создание нового Фабричного объекта плохой практикой?

XYZFactory factory = new XYZFactory(); 
XYZObj obj = factory.getInstance(TYPE);

Vs

XYZObj obj = XYZFactory.getInstance(TYPE);

Ответы [ 4 ]

9 голосов
/ 13 сентября 2011

Множество фабричных методов используются для предложения экземпляра самого класса без экспорта классом каких-либо конструкторов (см., Например, Josh Bloch item 1 ). Если бы фабричный метод был методом экземпляра, у вас не было бы объекта класса для начала.

Кроме того, getInstance() обычно не зависит от любого существующего экземпляра, поэтому он должен быть объявлен как статический. Если это зависит от одного, часто предпочтительным является прототип (т.е. clone()).

Наконец, вы должны различать фабричный метод public static getInstance() и абстрактную фабрику , которая является классом, который часто скрывает детали реализации для нескольких интерфейсов. Конечно, вы должны иметь возможность создавать экземпляры подклассов абстрактной фабрики. Вы можете найти отличное введение в шаблоны творчества («Абстрактная фабрика», «Фабричный метод», «Прототип» и др.) В книге «Классические шаблоны проектирования» из «Банды четырех» . Также приведен пример нестатического фабричного метода, смешанного с прототипом. Итак, вы видите, много вариантов возможно ...

3 голосов
/ 13 сентября 2011

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

0 голосов
/ 13 сентября 2011

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

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

0 голосов
/ 13 сентября 2011

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

...