Заводи мають багато переваг, що дозволяють зробити елегантний дизайн додатків у деяких ситуаціях. Одне полягає в тому, що ви можете встановити властивості об’єктів, які пізніше ви хочете створити в одному місці, створивши фабрику, а потім передати цю фабрику навколо. Але часто вам насправді цього не потрібно робити. У такому випадку використання заводу просто додає додаткових складностей, фактично не даючи нічого взамін. Візьмемо, наприклад, цю фабрику:
WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();
Однією з альтернатив фабричної схеми є дуже схожий шаблон Builder. Основна відмінність полягає в тому, що властивості об'єктів, створених Фабрикою, встановлюються при ініціалізації Фабрики, тоді як Builder ініціалізується зі станом за замовчуванням, а всі властивості встановлюються після цього.
WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();
Але коли надмірна інженерія - це ваша проблема, заміна Заводу на будівельника, швидше за все, не буде значною мірою поліпшенням.
Найпростіша заміна для будь-якого шаблону - це, звичайно, створення об’єктів-об'єктів за допомогою простого конструктора з newоператором:
Widget widget = new ColoredWidget(COLOR_RED);
Однак у конструкторів є важливий недолік у більшості об'єктно-орієнтованих мов: вони повинні повернути об'єкт саме цього класу і не можуть повернути підтип.
Коли вам потрібно вибрати підтип під час виконання, але не хочете вдаватися до створення цілого нового класу Builder або Factory, для цього ви можете використовувати заводський метод. Це статичний метод класу, який повертає нові екземпляри цього класу або одного з його підкласів. Завод, який не підтримує внутрішнього стану, часто може бути замінений таким фабричним методом:
Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget
Новою особливістю Java 8 є посилання на методи, які дозволяють вам передавати методи так, як ви це робили з заводом без громадянства. Зручно, що все, що приймає посилання на метод, також приймає будь-який об'єкт, який реалізує той самий функціональний інтерфейс, який також може бути повноцінною Фабрикою з внутрішнім станом, тому ви можете легко вводити заводи пізніше, коли побачите причину для цього.