ถามตัวเองว่าพวกเขาคืออะไรและทำไมเราถึงมีพวกเขา พวกเขาทั้งสองอยู่ที่นั่นเพื่อสร้างตัวอย่างของวัตถุ
ElementarySchool school = new ElementarySchool();
ElementarySchool school = SchoolFactory.Construct(); // new ElementarySchool() inside
ยังไม่มีความแตกต่าง ตอนนี้ลองนึกภาพว่าเรามีโรงเรียนหลายประเภทและเราต้องการเปลี่ยนจากการใช้ ElementarySchool เป็น HighSchool (ซึ่งได้มาจาก ElementarySchool หรือใช้อินเทอร์เฟซเดียวกันกับ ISchool เป็น ElementarySchool) การเปลี่ยนรหัสจะเป็น:
HighSchool school = new HighSchool();
HighSchool school = SchoolFactory.Construct(); // new HighSchool() inside
ในกรณีของอินเตอร์เฟสเราจะมี:
ISchool school = new HighSchool();
ISchool school = SchoolFactory.Construct(); // new HighSchool() inside
ตอนนี้ถ้าคุณมีรหัสนี้ในหลาย ๆ ที่คุณจะเห็นว่าการใช้วิธีการจากโรงงานอาจจะค่อนข้างถูกเพราะเมื่อคุณเปลี่ยนวิธีการจากโรงงานที่คุณทำเสร็จแล้ว (ถ้าเราใช้ตัวอย่างที่สองกับอินเทอร์เฟซ)
และนี่คือความแตกต่างและความได้เปรียบหลัก เมื่อคุณเริ่มจัดการกับลำดับชั้นของคลาสที่ซับซ้อนและคุณต้องการสร้างอินสแตนซ์ของคลาสจากลำดับชั้นดังกล่าวแบบไดนามิกคุณจะได้รับรหัสต่อไปนี้ วิธีการจากโรงงานอาจใช้พารามิเตอร์ที่บอกวิธีการที่อินสแตนซ์ที่เป็นรูปธรรมเพื่อยกตัวอย่าง สมมติว่าคุณมีคลาส MyStudent และคุณจำเป็นต้องสร้างอินสแตนซ์ของวัตถุ ISchool ที่สอดคล้องกันเพื่อให้นักเรียนของคุณเป็นสมาชิกของโรงเรียนนั้น
ISchool school = SchoolFactory.ConstructForStudent(myStudent);
ตอนนี้คุณมีที่เดียวในแอปของคุณที่มีตรรกะทางธุรกิจที่กำหนดว่าวัตถุ ISchool ใดจะยกตัวอย่างสำหรับวัตถุ IStudent ที่แตกต่างกัน
ดังนั้น - สำหรับคลาสที่เรียบง่าย (วัตถุที่มีค่า ฯลฯ ) คอนสตรัคเตอร์นั้นใช้ได้ (คุณไม่ต้องการ overengineer แอปพลิเคชันของคุณ) แต่สำหรับเมธอดคลาสโรงงานที่ซับซ้อนเป็นวิธีที่ต้องการ
วิธีนี้คุณจะทำตามหลักการออกแบบครั้งแรกจากแก๊งค์ของหนังสือสี่เล่ม "โปรแกรมไปยังอินเทอร์เฟซไม่ใช่การใช้งาน"