รูปแบบการออกแบบเชิงโครงสร้าง (Structural Design Patterns): Facade, Flyweight และ Proxy

รูปแบบการออกแบบเชิงโครงสร้างช่วยคุณในการจัดระเบียบคลาสและออบเจกต์

วันนี้เราจะมาครอบคลุม 3 รูปแบบสุดท้ายเพื่อเติมเต็มชุดเครื่องมือของคุณให้สมบูรณ์

๑. รูปแบบ Facade (The Facade Pattern) Facade ช่วยลดความซับซ้อนของระบบ โดยการสร้างอินเทอร์เฟซที่เรียบง่ายเพียงหนึ่งเดียวเพื่อใช้งานกลุ่มคลาสที่ซับซ้อน

ลองนึกถึงโรงภาพยนตร์ เพื่อที่จะดูหนัง คุณต้องหรี่ไฟ เริ่มเครื่องฉาย และเปิดม่าน แทนที่จะต้องเรียกใช้งานระบบที่แตกต่างกันถึง 5 ระบบ คุณเพียงแค่เรียกใช้เมธอดเดียว: theater.watch_movie()

ใช้เมื่อ:

  • คุณต้องการลดความซับซ้อนของระบบย่อย (subsystem)
  • คุณต้องการจุดเข้าใช้งานเพียงจุดเดียวสำหรับ API ขนาดใหญ่
  • คุณต้องการแยกส่วนการทำงานของไคลเอนต์ (client) ออกจากตรรกะภายใน (internal logic)

๒. รูปแบบ Flyweight (The Flyweight Pattern) Flyweight ช่วยประหยัดหน่วยความจำ โดยจะทำงานได้ดีเมื่อคุณมีออบเจกต์ที่คล้ายคลึงกันจำนวนหลายพันชิ้น

แทนที่จะเก็บรายละเอียดทุกอย่างไว้ในทุกออบเจกต์ คุณจะทำการแยกข้อมูล โดยเก็บข้อมูลที่ใช้ร่วมกันและไม่เปลี่ยนแปลง (intrinsic state) ไว้ที่เดียว และแยกข้อมูลที่มีลักษณะเฉพาะ (extrinsic state) ออกมาต่างหาก

ใช้เมื่อ:

  • การใช้งานหน่วยความจำเป็นปัญหาสำคัญ
  • คุณต้องจัดการกับออบเจกต์ที่คล้ายกันเป็นล้านๆ ชิ้น เช่น ตัวอักษรในโปรแกรมแก้ไขข้อความ หรืออนุภาค (particles) ในเกม
  • คุณต้องการใช้ object pooling เพื่อเพิ่มประสิทธิภาพการทำงาน

๓. รูปแบบ Proxy (The Proxy Pattern) Proxy ทำหน้าที่เป็นตัวแทนของออบเจกต์อื่น โดยจะอยู่ตรงกลางระหว่างไคลเอนต์และออบเจกต์จริงเพื่อควบคุมการเข้าถึง

Proxy สามารถ:

  • Lazy load: โหลดรูปภาพที่มีขนาดใหญ่เฉพาะเมื่อผู้ใช้คลิกเท่านั้น
  • ควบคุมการเข้าถึง: ตรวจสอบว่าผู้ใช้มีสิทธิ์ในการลบฐานข้อมูลหรือไม่
  • บันทึกกิจกรรม (Log activity): ติดตามว่าใครใช้งานบริการเฉพาะอย่างใดอย่างหนึ่ง
  • แคชผลลัพธ์ (Cache results): ส่งคืนข้อมูลที่บันทึกไว้แทนที่จะต้องรันตรรกะที่ใช้ทรัพยากรสูง

ใช้เมื่อ:

  • คุณต้องการหน่วงเวลาการทำงานที่ใช้ทรัพยากรสูง (expensive operations)
  • คุณต้องปกป้องบริการที่มีความสำคัญหรือมีความอ่อนไหว
  • คุณต้องการเพิ่มการบันทึกกิจกรรมหรือระบบความปลอดภัยโดยไม่ต้องแก้ไขคลาสต้นฉบับ

ตารางสรุป

Adapter: ทำให้ระบบที่ไม่สามารถทำงานร่วมกันได้สามารถทำงานด้วยกันได้ • Bridge: แยกส่วนการทำงานเชิงนามธรรม (abstraction) ออกจากการนำไปใช้งานจริง (implementation) • Composite: สร้างโครงสร้างแบบต้นไม้ (tree structures) • Decorator: เพิ่มพฤติกรรมโดยไม่ต้องแก้ไขคลาส • Facade: ลดความซับซ้อนของระบบย่อย • Flyweight: แชร์ข้อมูลเพื่อประหยัดหน่วยความจำ • Proxy: ควบคุมการเข้าถึงออบเจกต์

กฎเหล็ก: ใช้รูปแบบเหล่านี้เพื่อให้โค้ดสามารถบำรุงรักษาได้ง่าย อย่าใช้เพียงเพื่อต้องการอวดความรู้

ลำดับถัดไป เราจะเริ่มซีรีส์รูปแบบการออกแบบเชิงพฤติกรรม (Behavioral Design Patterns)

Source: https://dev.to/mahdi0shamlou/mahdi-shamlou-structural-design-patterns-2026-facade-flyweight-proxy-production-examples-g5l