โรงงานมีข้อดีหลายประการที่อนุญาตให้มีการออกแบบแอพพลิเคชั่นที่หรูหราในบางสถานการณ์ สิ่งแรกคือคุณสามารถตั้งค่าคุณสมบัติของวัตถุที่คุณต้องการสร้างในภายหลังได้ด้วยการสร้างโรงงานจากนั้นจึงส่งโรงงานนั้นไปรอบ ๆ แต่บ่อยครั้งที่คุณไม่จำเป็นต้องทำเช่นนั้น ในกรณีที่ใช้โรงงานเพียงเพิ่มความซับซ้อนเพิ่มเติมโดยไม่ให้อะไรตอบแทนคุณ ลองมาโรงงานนี้ตัวอย่าง:
WidgetFactory redWidgetFactory = new ColoredWidgetFactory(COLOR_RED);
Widget widget = redWidgetFactory.create();
ทางเลือกหนึ่งสำหรับรูปแบบโรงงานคือรูปแบบตัวสร้างที่คล้ายกันมาก ความแตกต่างที่สำคัญคือคุณสมบัติของวัตถุที่สร้างโดยโรงงานถูกตั้งค่าเมื่อเริ่มต้นจากโรงงานในขณะที่ตัวสร้างจะเริ่มต้นด้วยสถานะเริ่มต้นและคุณสมบัติทั้งหมดจะถูกตั้งค่าในภายหลัง
WidgetBuilder widgetBuilder = new WidgetBuilder();
widgetBuilder.setColor(COLOR_RED);
Widget widget = widgetBuilder.create();
แต่เมื่อมีปัญหาเกี่ยวกับการ overengineering การแทนที่ Factory ด้วย Builder อาจไม่ได้รับการปรับปรุงมากนัก
การแทนที่แบบง่ายที่สุดสำหรับทั้งสองรูปแบบนั้นแน่นอนในการสร้างออบเจ็กต์อินสแตนซ์ด้วย Constructor แบบง่าย ๆ กับnew
โอเปอเรเตอร์:
Widget widget = new ColoredWidget(COLOR_RED);
อย่างไรก็ตามคอนสตรัคเตอร์มีข้อเสียเปรียบที่สำคัญในภาษาเชิงวัตถุส่วนใหญ่: พวกมันจะต้องส่งคืนออบเจ็กต์ของคลาสที่แน่นอนนั้นและไม่สามารถส่งคืนชนิดย่อยได้
เมื่อคุณต้องการเลือกประเภทย่อยตอนรันไทม์ แต่ไม่ต้องการหันไปใช้การสร้างทั้ง Builder หรือคลาสใหม่สำหรับคลาสนั้นคุณสามารถใช้วิธีการจากโรงงานแทน นี่เป็นวิธีการคงที่ของคลาสที่ส่งกลับอินสแตนซ์ใหม่ของคลาสนั้นหรือหนึ่งในคลาสย่อย โรงงานที่ไม่รักษาสถานะภายในใด ๆ มักจะถูกแทนที่ด้วยวิธีการจากโรงงานดังกล่าว:
Widget widget = Widget.createColoredWidget(COLOR_RED); // returns an object of class RedColoredWidget
คุณลักษณะใหม่ใน Java 8 เป็นการอ้างอิงวิธีการซึ่งช่วยให้คุณผ่านวิธีการต่างๆได้เหมือนกับที่คุณทำกับโรงงานไร้สัญชาติ สะดวกสิ่งใดก็ตามที่ยอมรับการอ้างอิงเมธอดยังยอมรับวัตถุใด ๆ ที่ใช้อินเทอร์เฟซการทำงานเดียวกันซึ่งสามารถเป็นโรงงานที่เต็มเปี่ยมด้วยสถานะภายในเพื่อให้คุณสามารถแนะนำโรงงานได้ในภายหลังเมื่อคุณเห็นเหตุผลในการทำเช่นนั้น