รูปแบบการออกแบบรุ่นฟลายเวทคืออะไร?

ฟลายเวทเป็นวัตถุที่ใช้ร่วมกันซึ่งสามารถใช้ได้ในหลายบริบทพร้อมกัน

รูปแบบการออกแบบรุ่นฟลายเวตจะใช้เมื่อจำเป็นต้องสร้างวัตถุจำนวนมากที่มีลักษณะใกล้เคียงกัน วัตถุจำนวนมากใช้หน่วยความจำจำนวนมาก และรูปแบบการออกแบบ 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

ในการซื้อคืนนี้ คุณจะพบสรุปรูปแบบการออกแบบทั้งหมดที่ฉันทำ รวมถึงข้อมูลอ้างอิงที่ฉันพึ่งพาด้วย

https://github.com/MohamedHashish42/Design_Patterns