วัตถุประสงค์ในการใช้รูปแบบฟลายเวทคือเพื่อหลีกเลี่ยงการเริ่มต้นวัตถุที่ไม่จำเป็นและทำให้ประหยัดพื้นที่ ตามที่กำหนดโดยGOFวัตถุสามารถมีสองสถานะคือสถานะที่แท้จริงและสถานะภายนอก:
- สถานะที่แท้จริง:ถูกเก็บไว้ในฟลายเวท; ประกอบด้วยข้อมูลที่เป็นอิสระในบริบท flyweights จึงทำให้สามารถแบ่งปันได้
- สถานะ Extrinsic:ขึ้นอยู่กับและแตกต่างกันไปตามบริบทของฟลายเวทและไม่สามารถแบ่งปันได้ วัตถุไคลเอนต์มีหน้าที่รับผิดชอบในการผ่านสถานะภายนอกไปยังฟลายเวทเมื่อมันต้องการ
สมมติว่าเราต้องการพัฒนาแอปพลิเคชั่นตัวแก้ไขข้อความอย่างง่ายโดยที่แต่ละคอลัมน์มีแถวทั้งหมดของข้อความและแถวสามารถมีอักขระได้
ขึ้นเขียงที่นี่เป็นวิธีการออกแบบคลาสตัวละคร char c
ภายในชั้นเรียนตัวอักษรที่ควรจะเป็นหลัก (รัฐที่แท้จริง) วัตถุ อย่างไรก็ตามถ่านสามารถมีแบบอักษรและขนาด (สถานะภายนอก); ดังนั้นเราจำเป็นต้องเก็บสถานะภายนอกของมันไว้ในแถว (ไคลเอนต์) และเข้าถึงเมื่อจำเป็น เพื่อจุดประสงค์นี้สองรายการที่เก็บแบบอักษรและขนาดจะถูกสร้างขึ้น
ด้วยการทำตามรูปแบบ Flyweight ตอนนี้ตัวละครจะสามารถนำมาใช้ซ้ำได้และวัตถุจะถูกอ้างอิงจากรายการของวัตถุที่เฉพาะเจาะจง (พูลฟลายเวท) ซึ่งมีสัญลักษณ์ ASCII ทั้งหมด ( Character
วัตถุ)
นี่คือสิ่งที่ฉันอธิบายด้วยภาพ:

สำหรับการพิมพ์ 'hello' ต้องการเพียง 4 Character
วัตถุแทน 5 เมื่อเปลี่ยนแบบอักษรแล้วไม่จำเป็นต้องมีวัตถุใหม่ โปรดทราบว่าสิ่งนี้จะเป็นไปไม่ได้หากเราเก็บสถานะภายนอกไว้ในคลาสอักขระเช่น
class Character
{
char c;
int Size;
Font font;
....
}
การใช้รูปแบบนี้กับชุดข้อมูลขนาดใหญ่จะนำไปสู่การปรับให้เหมาะสมอย่างมีนัยสำคัญกับความซับซ้อนของหน่วยความจำของแอปพลิเคชันและการใช้งานวัตถุ