Почему метод getInstance () в шаблоне Factory должен быть статическим?


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

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

Vs

XYZObj obj = XYZFactory.getInstance(TYPE);
4 7

4 ответа:

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

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

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

Наконец, вы следует различать метод фабрики public static getInstance() и абстрактную фабрику, которая является классом, скрывающим детали реализации часто для нескольких интерфейсов. Конечно, вы должны уметь создавать экземпляры подклассов абстрактной фабрики. Вы можете найти отличное введение в создание шаблонов (абстрактная Фабрика, фабричный метод, прототип и т. д.) В книге classic Design Patterns от The Gang of Four. Он также дает пример нестатического фабричного метода вперемешку с прототипом. Так что, как видите, возможны многие варианты...

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

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

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