รูปแบบการออกแบบเชิงโครงสร้าง (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)