Các nhà máy có nhiều ưu điểm cho phép thiết kế ứng dụng thanh lịch trong một số tình huống. Một là bạn có thể đặt các thuộc tính của các đối tượng mà sau này bạn muốn tạo ở một nơi bằng cách tạo một nhà máy, và sau đó bàn giao nhà máy đó. Nhưng thường thì bạn không thực sự cần phải làm điều đó. Trong trường hợp đó, sử dụng Factory chỉ tăng thêm độ phức tạp mà không thực sự mang lại cho bạn bất cứ điều gì. Hãy lấy nhà máy này, ví dụ:
WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();
Một thay thế cho mẫu Factory là mẫu Builder rất giống nhau. Sự khác biệt chính là các thuộc tính của các đối tượng được tạo bởi Factory được đặt khi Factory được khởi tạo, trong khi Builder được khởi tạo với trạng thái mặc định và tất cả các thuộc tính được đặt sau đó.
WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();
Nhưng khi áp đảo là vấn đề của bạn, việc thay thế Factory bằng Builder có thể không có nhiều cải tiến.
Tất nhiên, sự thay thế đơn giản nhất cho một trong hai mẫu là tạo các thể hiện đối tượng với một hàm tạo đơn giản với new
toán tử:
Widget widget = new ColoredWidget(COLOR_RED);
Tuy nhiên, các nhà xây dựng có một nhược điểm rất quan trọng trong hầu hết các ngôn ngữ hướng đối tượng: Họ phải trả về một đối tượng của lớp chính xác đó và không thể trả về một kiểu con.
Khi bạn cần chọn loại phụ trong thời gian chạy nhưng không muốn sử dụng để tạo một lớp Builder hoặc Factory hoàn toàn mới cho điều đó, bạn có thể sử dụng phương thức nhà máy thay thế. Đây là một phương thức tĩnh của một lớp trả về một thể hiện mới của lớp đó hoặc một trong các lớp con của nó. Một Nhà máy không duy trì bất kỳ trạng thái nội bộ nào thường có thể được thay thế bằng phương pháp nhà máy như vậy:
Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget
Một tính năng mới trong Java 8 là các tham chiếu phương thức cho phép bạn truyền các phương thức xung quanh, giống như bạn làm với một nhà máy không trạng thái. Thuận tiện, bất cứ điều gì chấp nhận tham chiếu phương thức cũng chấp nhận bất kỳ đối tượng nào thực hiện cùng giao diện chức năng, cũng có thể là Nhà máy chính thức với trạng thái bên trong, vì vậy bạn có thể dễ dàng giới thiệu các nhà máy sau này, khi bạn thấy lý do để làm như vậy.