Fabryki mają wiele zalet, które pozwalają na eleganckie projekty aplikacji w niektórych sytuacjach. Jednym z nich jest to, że możesz ustawić właściwości obiektów, które później chcesz utworzyć w jednym miejscu, tworząc fabrykę, a następnie przekazując tę fabrykę. Ale często tak naprawdę nie musisz tego robić. W takim przypadku użycie fabryki tylko zwiększa złożoność, nie dając ci nic w zamian. Weźmy na przykład tę fabrykę:
WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();
Jedną z alternatyw dla wzorca fabrycznego jest bardzo podobny wzorzec konstruktora. Główna różnica polega na tym, że właściwości obiektów utworzonych przez fabrykę są ustawiane podczas inicjalizacji fabryki, podczas gdy program budowniczy jest inicjowany z domyślnym stanem, a wszystkie właściwości są ustawiane później.
WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();
Ale kiedy problemem jest nadinżynieria, zastąpienie fabryki konstruktorem prawdopodobnie nie stanowi znacznej poprawy.
Najprostszym zamiennikiem dla każdego wzorca jest oczywiście tworzenie instancji obiektów za pomocą prostego konstruktora z new
operatorem:
Widget widget = new ColoredWidget(COLOR_RED);
Konstruktory mają jednak istotną wadę w większości języków zorientowanych obiektowo: muszą zwracać obiekt dokładnie tej klasy i nie mogą zwracać podtypu.
Jeśli musisz wybrać podtyp w czasie wykonywania, ale nie chcesz do tego tworzyć zupełnie nowej klasy Builder lub Factory, możesz zamiast tego użyć metody factory. Jest to statyczna metoda klasy, która zwraca nowe instancje tej klasy lub jednej z jej podklas. Fabrykę, która nie utrzymuje żadnego stanu wewnętrznego, często można zastąpić taką metodą fabryczną:
Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget
Nową funkcją w Javie 8 są odwołania do metod, które umożliwiają przekazywanie metod, tak jak w przypadku fabryki bezstanowej. Dogodnie wszystko, co akceptuje odwołanie do metody, akceptuje również każdy obiekt, który implementuje ten sam interfejs funkcjonalny, którym może być również pełnoprawna Fabryka ze stanem wewnętrznym, dzięki czemu można łatwo wprowadzić fabryki później, gdy zobaczy się powód.