ทั้งสามรูปแบบนี้เป็น Design Patterns พื้นฐานที่สำคัญมากในการเขียนโปรแกรมระดับมืออาชีพ เพื่อให้ Code สะอาด , ดูแลรักษาง่าย และทดสอบได้ง่าย
นี่คือสรุปเนื้อหาและตัวอย่างการใช้งานของแต่ละตัวครับ
Dependency Injection
แนวคิด: แทนที่ Object จะสร้างสิ่งที่มันต้องใช้งาน ขึ้นมาเอง เราจะส่งสิ่งนั้นเข้าไปให้จากภายนอกแทน เปรียบเสมือน “การส่งเครื่องมือให้ช่าง” แทนที่จะให้ “ช่างไปสร้างเครื่องมือเอง”
- ปัญหา: หาก Class A สร้าง Class B ข้างใน เมื่อ Class B เปลี่ยนแปลง Class A จะพังไปด้วย
- วิธีแก้: ส่ง Class B เข้าไปทาง Constructor หรือ Method
ตัวอย่าง: หากคุณทำระบบแจ้งเตือน แทนที่จะระบุใน Code ว่าต้องส่งผ่าน LINE เท่านั้น คุณสามารถฉีด บริการส่งข้อความอะไรก็ได้เข้าไปตราบใดที่มีมาตรฐานเดียวกัน
Factory Pattern
แนวคิด: เป็นตัวกลางในการสร้าง Object โดยที่เราไม่ต้องระบุ Class เจาะจงใน Code หลัก เราแค่บอก “เงื่อนไข” แล้ว Factory จะส่ง Object ที่ถูกต้องกลับมาให้
- ปัญหา: เมื่อมี Object หลายประเภทที่คล้ายกัน แต่มีวิธีสร้างต่างกัน การใช้
if-elseหรือnewกระจัดกระจายจะทำให้แก้ไขยาก - วิธีแก้: สร้าง Class “โรงงาน” มาจัดการเรื่องการสร้าง Object โดยเฉพาะ
ตัวอย่าง: ระบบชำระเงิน คุณอาจจะมี PaymentFactory ที่รับค่าว่า “CreditCard” หรือ “PayPal” แล้วมันจะสร้าง Object ของการชำระเงินประเภทนั้นมาให้คุณใช้งานทันที
Repository Pattern
แนวคิด: เป็นตัวคั่นกลางระหว่าง Business Logic กับ Data Source เพื่อให้ Code ส่วนคำนวณไม่ต้องรู้ว่าข้อมูลถูกเก็บไว้ที่ไหนหรือเก็บอย่างไร
- ปัญหา: หากเราเขียนคำสั่ง SQL ไว้ใน Controller เมื่อเราเปลี่ยนจาก MySQL เป็น MongoDB หรือเปลี่ยน Library ที่ใช้เชื่อมต่อ เราต้องไล่แก้ Code ทั้งโปรเจกต์
- วิธีแก้: สร้าง Repository Interface ขึ้นมาเพื่อจัดการคำสั่ง Get, Save, Update, Delete
ตัวอย่าง: UserRepository จะมี Method เช่น findById () ส่วนภายในจะไปดึงจาก SQL Database หรือ Cache Memory นั้น Logic ส่วนอื่นไม่จำเป็นต้องรับรู้
สรุปความแตกต่าง
| Pattern | หน้าที่หลัก | ประโยชน์ที่เห็นชัด |
| Dependency Injection | การส่ง Object เข้าไปใช้งาน | ลดการยึดติดกันของ Code |
| Factory Pattern | การสร้าง Object | รวมศูนย์การสร้างไว้ที่เดียว ไม่ต้อง new เองมั่ว ๆ |
| Repository Pattern | การจัดการข้อมูล | เปลี่ยนแหล่งเก็บข้อมูลได้โดยไม่กระทบ Logic หลัก |
คำแนะนำเพิ่มเติม
หากคุณกำลังพัฒนาโปรเจกต์ขนาดใหญ่ การใช้ทั้งสามอย่างร่วมกันจะช่วยได้มาก เช่น
- ใช้ Repository จัดการฐานข้อมูล
- ใช้ Factory เลือกว่าจะใช้ Repository ตัวไหน
- ใช้ DI ฉีด Repository นั้นเข้าไปใน Service เพื่อใช้งาน
อ่านเพิ่มเติม