Factory Pattern เป็นหนึ่งใน Design Patterns กลุ่ม Creational ที่ได้รับความนิยมมากที่สุด หน้าที่หลักของมันคือการ “แยกส่วนการสร้าง Object ออกจากส่วนการใช้งาน” เพื่อให้ Code ของเรายืดหยุ่นและดูแลรักษาง่ายขึ้นครับ
🏗️ Factory Pattern คืออะไร ?
ลองจินตนาการถึงโรงงานจริง ๆ ครับ เมื่อคุณต้องการ “ปลั๊กไฟ” คุณเดินไปที่โรงงานแล้วบอกว่า “ขอปลั๊กไฟ 1 อัน” โรงงานจะจัดการขั้นตอนการหล่อพลาสติก การต่อสายไฟ และส่งสินค้าสำเร็จรูปให้คุณ โดยที่คุณ ไม่จำเป็นต้องรู้เลย ว่าเครื่องจักรตัวไหนทำงาน หรือผสมพลาสติกอย่างไร
ในทาง Software: Factory Pattern คือคลาสที่ทำหน้าที่สร้าง Object ให้เรา โดยที่เรา ไม่ต้องใช้คำสั่ง new เพื่อระบุคลาสที่เจาะจงเอง
🛠️ ทำไมต้องใช้ Factory Pattern ?
- Loose Coupling: ลดการยึดติดกันระหว่างคลาส ถ้าในอนาคตคุณเปลี่ยนชื่อคลาสลูก หรือเพิ่มประเภทสินค้าใหม่ คุณแก้แค่ที่ Factory ที่เดียว
- Code Cleanliness: ส่วนที่เรียกใช้งาน จะดูสะอาดขึ้น เพราะไม่ต้องมี Logic การตัดสินใจ ว่าต้องสร้าง Object ตัวไหน กระจัดกระจายอยู่ทั่วไป
- Centralized Control: การสร้าง Object ทั้งหมดถูกควบคุมจากจุดเดียว ง่ายต่อการทำ Unit Testing หรือใส่ Log
💻 ตัวอย่างการใช้งาน
สมมติว่าเรากำลังสร้างระบบ แจ้งเตือน ที่รองรับทั้ง Email และ SMS
สร้าง Interface
เราต้องกำหนดก่อนว่า “สินค้า” ทุกอย่างที่ออกจากโรงงานต้องทำอะไรได้บ้าง
public interface INotification { void Send (string message) ;
}
สร้าง Concrete Classes
สร้างคลาสจริงที่ทำงานตาม Interface
public class EmailNotification : INotification { public void Send (string message) => Console.WriteLine ($"Sending Email: {message}") ;
} public class SmsNotification : INotification { public void Send (string message) => Console.WriteLine ($"Sending SMS: {message}") ;
}
สร้าง Factory Class
นี่คือหัวใจของ Pattern นี้ครับ
public class NotificationFactory { public INotification CreateNotification (string type) { return type.ToLower () switch { "email" => new EmailNotification () , "sms" => new SmsNotification () , _ => throw new ArgumentException ("Unknown type") }; }
}
การนำไปใช้งาน
var factory = new NotificationFactory () ; // เราแค่บอกว่าอยากได้ "email" ไม่ต้องรู้ว่ามัน New อย่างไร
INotification notification = factory.CreateNotification ("email") ;
notification.Send ("สวัสดีครับ!") ;
⚠️ ข้อควรระวัง
แม้จะมีข้อดีมาก แต่ Factory Pattern ก็มีข้อเสียหากใช้ไม่ถูกที่
- Complexity: ถ้าโปรเจกต์เล็กมาก การสร้าง Factory อาจจะดู “เยอะเกินไป”
- Abstraction Overload: การมี Interface และ Class เยอะเกินไปอาจทำให้ไล่ Code ได้ยากสำหรับมือใหม่
สรุป: เลือกใช้ Factory Pattern เมื่อคุณเริ่มรู้สึกว่า Code มีการ if-else เพื่อสร้าง Object บ่อยเกินไป หรือเมื่อต้องการให้ระบบรองรับการขยายตัวในอนาคตโดยไม่กระทบ Code ส่วนเดิมครับ
อ่านเพิ่มเติม