Factory Pattern

Factory Pattern เป็นหนึ่งใน Design Patterns กลุ่ม Creational ที่ได้รับความนิยมมากที่สุด หน้าที่หลักของมันคือการ “แยกส่วนการสร้าง Object ออกจากส่วนการใช้งาน” เพื่อให้ Code ของเรายืดหยุ่นและดูแลรักษาง่ายขึ้นครับ


🏗️ Factory Pattern คืออะไร ?

ลองจินตนาการถึงโรงงานจริง ๆ ครับ เมื่อคุณต้องการ “ปลั๊กไฟ” คุณเดินไปที่โรงงานแล้วบอกว่า “ขอปลั๊กไฟ 1 อัน” โรงงานจะจัดการขั้นตอนการหล่อพลาสติก การต่อสายไฟ และส่งสินค้าสำเร็จรูปให้คุณ โดยที่คุณ ไม่จำเป็นต้องรู้เลย ว่าเครื่องจักรตัวไหนทำงาน หรือผสมพลาสติกอย่างไร

ในทาง Software: Factory Pattern คือคลาสที่ทำหน้าที่สร้าง Object ให้เรา โดยที่เรา ไม่ต้องใช้คำสั่ง new เพื่อระบุคลาสที่เจาะจงเอง


🛠️ ทำไมต้องใช้ Factory Pattern ?

  1. Loose Coupling: ลดการยึดติดกันระหว่างคลาส ถ้าในอนาคตคุณเปลี่ยนชื่อคลาสลูก หรือเพิ่มประเภทสินค้าใหม่ คุณแก้แค่ที่ Factory ที่เดียว
  2. Code Cleanliness: ส่วนที่เรียกใช้งาน จะดูสะอาดขึ้น เพราะไม่ต้องมี Logic การตัดสินใจ ว่าต้องสร้าง Object ตัวไหน กระจัดกระจายอยู่ทั่วไป
  3. 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 ส่วนเดิมครับ


อ่านเพิ่มเติม