Notes & software courses · Free to learn
Aph's Blog
On this page

Design Patterns พื้นฐาน

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

วิธีแก้ปัญหาการออกแบบที่เจอซ้ำ ๆ แบบมีแบบแผน — รู้จักไว้และใช้เมื่อมันแก้ปัญหาจริง

design pattern คือ "สูตรสำเร็จ" ของวิธีแก้ปัญหาการออกแบบที่เจอบ่อย ๆ ทำให้สื่อสารกับเพื่อนร่วมทีมได้ด้วยชื่อที่เข้าใจตรงกัน หัวข้อนี้แนะนำ pattern ที่เจอบ่อยพอให้รู้จัก ไม่ใช่ท่องทุกตัว

Strategy — สลับวิธีทำงานได้

เมื่อมีหลายวิธีทำงานเดียวกัน (เช่นหลายวิธีคำนวณค่าส่ง) ทำให้สลับได้โดยไม่ต้องเขียน if ยาว ๆ

python
# แต่ละวิธีส่งเป็นฟังก์ชัน แล้วเลือกใช้
def standard_shipping(weight): return weight * 10
def express_shipping(weight): return weight * 25

def checkout(weight, shipping_strategy):
    return shipping_strategy(weight)    # สลับวิธีได้

print(checkout(2, standard_shipping))   # 20
print(checkout(2, express_shipping))    # 50

Factory — รวมที่สร้าง object ไว้จุดเดียว

เมื่อต้องสร้าง object ต่างชนิดตามเงื่อนไข ใช้ factory function รวมตรรกะการสร้างไว้ที่เดียว

python
def create_notifier(kind):
    if kind == "email":
        return EmailNotifier()
    elif kind == "sms":
        return SMSNotifier()
    raise ValueError(f"ไม่รู้จัก: {kind}")

notifier = create_notifier("email")   # ผู้เรียกไม่ต้องรู้ว่าสร้างยังไง

Observer & Singleton (รู้จักไว้)

Patternแก้ปัญหาตัวอย่างที่เจอ
Strategyสลับ algorithm ได้วิธีคำนวณ/เรียงลำดับหลายแบบ
Factoryรวมการสร้าง objectสร้าง object ตาม config/type
Observerแจ้งเตือนเมื่อมีการเปลี่ยนevent, subscribe/publish
Singletonมี instance เดียวทั้งระบบconfig, connection pool
อย่ายัด pattern เพราะอยากใช้

pattern เป็นเครื่องมือแก้ปัญหา ไม่ใช่เป้าหมาย — มือใหม่มักยัด pattern ใส่โค้ดง่าย ๆ จนซับซ้อนเกิน (ละเมิด KISS) ใช้เมื่อเจอปัญหาที่ pattern นั้นแก้จริงเท่านั้น หลายครั้งฟังก์ชันธรรมดาก็พอแล้ว

สรุปหัวข้อนี้

  • design pattern = สูตรแก้ปัญหาออกแบบที่เจอซ้ำ + ภาษากลางในทีม
  • Strategy: สลับวิธีทำงาน; Factory: รวมการสร้าง object
  • Observer: แจ้งเตือนการเปลี่ยน; Singleton: instance เดียว
  • ใช้เมื่อแก้ปัญหาจริง — อย่ายัดจนซับซ้อนเกิน (KISS)
แบบฝึกหัด

1) ใช้ Strategy เลือกวิธีคำนวณค่าส่ง 2-3 แบบ 2) เขียน factory function สร้าง object ตาม type 3) ยกตัวอย่างสถานการณ์จริงที่เหมาะกับ Singleton 4) อธิบายว่าทำไมการยัด pattern เกินจำเป็นเป็นปัญหา