รูปแบบการออกแบบรุ่นฟลายเวทคืออะไร?
ฟลายเวทเป็นวัตถุที่ใช้ร่วมกันซึ่งสามารถใช้ได้ในหลายบริบทพร้อมกัน
รูปแบบการออกแบบรุ่นฟลายเวตจะใช้เมื่อจำเป็นต้องสร้างวัตถุจำนวนมากที่มีลักษณะใกล้เคียงกัน วัตถุจำนวนมากใช้หน่วยความจำจำนวนมาก และรูปแบบการออกแบบ Flyweight มอบโซลูชันสำหรับการลดภาระในหน่วยความจำด้วยการแบ่งปันวัตถุ
แผนผังชั้นของรูปแบบการออกแบบรุ่นฟลายเวท:
ดังที่แสดงในแผนภาพก่อนหน้านี้ มีองค์ประกอบสามส่วนที่เกี่ยวข้องกับรูปแบบการออกแบบรุ่นฟลายเวท:
1-ฟลายเวท:
เป็นอินเทอร์เฟซที่กำหนดสมาชิกของวัตถุรุ่นฟลายเวท อินเทอร์เฟซนี้ช่วยให้สามารถแชร์ได้ แต่ไม่ได้บังคับใช้
2-ConcreteFlyweight (แชร์หรือไม่แชร์):
a-SharedConcreteFlyweight:
คลาสที่ใช้อินเทอร์เฟซ Flyweight และเพิ่มพื้นที่เก็บข้อมูลสำหรับสถานะที่แท้จริง หากมี และต้องแชร์ได้
b-UnsharedConcreteFlyweight:
คลาสยังใช้อินเทอร์เฟซ Flyweight และเพิ่มพื้นที่เก็บข้อมูลสำหรับอินสแตนซ์เฉพาะและไม่มีการแชร์
3-โรงงานรุ่นฟลายเวท:
มีเมธอด GetFlyweight วิธีนี้จะตรวจสอบว่าวัตถุฟลายเวทอยู่ในแคชหรือไม่ หากมีอยู่ก็จะส่งคืนวัตถุรุ่นฟลายเวทที่มีอยู่ และหากไม่มีอยู่ มันจะสร้างวัตถุรุ่นฟลายเวทใหม่และเพิ่มวัตถุนั้นลงในแคชและส่งคืนวัตถุรุ่นฟลายเวทนั้น
สถานะต่างๆ ในรูปแบบการออกแบบรุ่นฟลายเวต:
สภาพที่แท้จริง:
เป็นสิ่งที่คงที่และเก็บไว้ในความทรงจำ
สภาวะภายนอก:
เป็นสิ่งที่ไม่คงที่และจำเป็นต้องคำนวณบน Fly
จึงไม่ได้เก็บไว้ในหน่วยความจำ
ออบเจ็กต์ไคลเอนต์มีหน้าที่รับผิดชอบในการส่งผ่านสถานะภายนอกไปยังฟลายเวทเมื่อจำเป็น
ทำความเข้าใจรูปแบบการออกแบบรุ่นฟลายเวตด้วยตัวอย่าง:
สมมติว่าเราต้องสร้างวัตถุวงกลม 30000 ด้วย สีแดง, 30000 วัตถุวงกลมด้วย สีเทา และ 50000 วัตถุสามเหลี่ยมที่มีสีเหลือง
โดยไม่ต้องใช้ฟลายเวท
เราจะสร้างวัตถุวงกลมหรือสามเหลี่ยมใหม่ทุกครั้งที่เราต้องการหนึ่งในนั้นและเติมด้วยสีที่ต้องการซึ่งหมายถึง วัตถุวงกลม 30,000 ชิ้นที่มีสีแดง และ วัตถุวงกลม 30000 ชิ้นที่มีสีเทาสีและวัตถุสามเหลี่ยม 50,000 ชิ้นที่มีสีเหลือง และสิ่งนี้จะใช้หน่วยความจำจำนวนมากอย่างแน่นอน
การใช้ฟลายเวท
เราจะสร้างและจัดเก็บวัตถุวงกลมหนึ่งชิ้นและวัตถุสามเหลี่ยมหนึ่งชิ้นโดยไม่มีสีในแคช และเมื่อเราต้องการสร้างวงกลมหรือสามเหลี่ยม เราสามารถดึงวัตถุจากแคช จากนั้นใช้วัตถุนี้ เราจะส่งสีที่เราต้องการ ซึ่งหมายความว่าเราต้องการวัตถุวงกลม 1 ชิ้นในการวาด (วัตถุวงกลม 30,000 ชิ้นที่มีสีแดง และวัตถุวงกลม 30,000 ชิ้นที่มีสีเทา ) และวัตถุสามเหลี่ยม 1 ชิ้นเพื่อวาด วัตถุสามเหลี่ยม 50000 ชิ้นที่มีสีเหลือง
ในตัวอย่างของเรา วงกลมและสามเหลี่ยมจะเป็นตัวแทนของ SharedConcreteFlyweight และสี่เหลี่ยมผืนผ้าจะเป็นตัวแทนของ UnsharedConcreteFlyweight
แผนภาพต่อไปนี้แสดงวิธีแก้ปัญหาการใช้ฟลายเวท:
แผนภาพคลาสสำหรับตัวอย่างของเรา:
รัฐภายในและรัฐภายนอกในตัวอย่างของเรา:
ในตัวอย่างของเรา รูปร่างวงกลมและสามเหลี่ยมเป็นค่าคงที่ (ไม่มีการเปลี่ยนแปลง) นั่นหมายความว่าถ้าสีเปลี่ยนไปรูปร่างของวงกลมหรือสามเหลี่ยมก็จะเหมือนเดิม ดังนั้นจึงถูกเก็บไว้ในหน่วยความจำ (แคช) และเนื่องจากมันถูกเก็บไว้ในหน่วยความจำและมีค่าคงที่ มันก็จะอยู่ในสถานะที่แท้จริง
แต่สีไม่คงที่และคำนวณได้ทันที ดังนั้นจึงไม่ถูกเก็บไว้ในหน่วยความจำ (แคช) ด้วยเหตุนี้ สีจึงอยู่ในสถานะภายนอก
การนำไปปฏิบัติ:
เมื่อใดจึงควรใช้รูปแบบการออกแบบรุ่นฟลายเวท
เราจำเป็นต้องใช้รูปแบบการออกแบบฟลายเวทเมื่อ
1- มีการใช้ออบเจ็กต์ที่คล้ายกันจำนวนมากและต้นทุนการจัดเก็บสูง
2- ข้อมูลสถานะส่วนใหญ่ของออบเจ็กต์แต่ละรายการสามารถทำให้เป็นภายนอกได้
3 -วัตถุที่ใช้ร่วมกันบางส่วนสามารถแทนที่วัตถุที่ไม่ได้แบ่งปันจำนวนมากได้อย่างง่ายดาย
ลิงค์รหัสเต็มบน Github:
การออกแบบโครงสร้างรูปแบบ/7-FlyweightDP
Repo รูปแบบการออกแบบเต็มรูปแบบบน Github
ในการซื้อคืนนี้ คุณจะพบสรุปรูปแบบการออกแบบทั้งหมดที่ฉันทำ รวมถึงข้อมูลอ้างอิงที่ฉันพึ่งพาด้วย