
الگوی طراحـــــــــی Fly Weight
الگوی طراحی Flyweight یکی از الگوهای ساختاری (Structural Patterns) است که در حوزه بازیسازی به طور گستردهای استفاده میشود. هدف این الگو، بهینهسازی استفاده از حافظه و کاهش هزینههای ذخیرهسازی برای اشیاء با ویژگیهای مشابه است. با استفاده از الگوی Flyweight، میتوانیم اشیاءی را که دارای ویژگیهای مشابه هستند، به اشتراک بگذاریم و در حافظه تنها یک نسخه از آنها را نگهداری کنیم.
برای بهتر درک این الگو، بهتر است یک مثال کاربردی در دنیای واقعی را در نظر بگیریم. فرض کنید شما یک سیستم پرداخت آنلاین دارید که برای انجام پرداختها نیاز به ارتباط با چندین درگاه پرداخت مختلف دارد. هر درگاه پرداخت نیاز به اتصال به سرویسهای بانکی و انجام اعتبارسنجی دارد. برای سادهتر کردن روند پرداخت و انتزاع از جزئیات زیرسیستمها، از الگوی Facade استفاده میکنیم.
برای بهتر درک این الگو، بهتر است یک مثال کاربردی در حوزه بازیسازی را در نظر بگیریم. فرض کنید شما یک بازی کامپیوتری دارید که در آن باید شخصیتهای مختلفی را ایجاد کنید. هر شخصیت دارای ویژگیهای مشخصی است، اما برخی از این ویژگیها برای چندین شخصیت مشترک هستند. با استفاده از الگوی Flyweight، میتوانیم این ویژگیهای مشترک را به اشتراک بگذاریم و بهینهسازی مصرف حافظه انجام دهیم.
برای درک بهتر این الگو، با یک مثال ملموس و کاربردی در دنیای واقعی آشنا میشویم:
1. Flyweight (اشیاء سبک): اینجا کلاس `CharacterFlyweight` را تعریف میکنیم که ویژگیهای مشترک برای شخصیتها را نگهداری میکند.
1public class CharacterFlyweight
2{
3 public string Name { get; private set; }
4 public int Health { get; private set; }
5 public int Power { get; private set; }
6
7 public CharacterFlyweight(string name, int health, int power)
8 {
9 Name = name;
10 Health = health;
11 Power = power;
12 }
13}
2. Flyweight Factory (کارخانه اشیاء سبک): اینجا کلاس `CharacterFlyweightFactory` را تعریف میکنیم که اشیاء سبک را مدیریت و به اشتراک میگذارد.
1public class CharacterFlyweightFactory
2{
3 private Dictionary<string, CharacterFlyweight> characterFlyweights;
4
5 public CharacterFlyweightFactory()
6 {
7 characterFlyweights = new Dictionary<string, CharacterFlyweight>();
8 }
9
10 public CharacterFlyweight GetCharacterFlyweight(string name, int health, int power)
11 {
12 string key = $"{name}_{health}_{power}";
13
14 if (!characterFlyweights.ContainsKey(key))
15 {
16 characterFlyweights[key] = new CharacterFlyweight(name, health, power);
17 }
18
19 return characterFlyweights[key];
20 }
21}
3. Client (کلاینت): اینجا برنامهای را با توجه به الگوی Flyweight ایجاد میکنیم و اشیاء شخصیتها را به اشتراک میگذاریم.
1public class Program
2{
3 public static void Main()
4 {
5 CharacterFlyweightFactory flyweightFactory = new CharacterFlyweightFactory();
6
7 // ایجاد اشیاء سبک برای شخصیتها
8 CharacterFlyweight orcFlyweight = flyweightFactory.GetCharacterFlyweight("Orc", 100, 20);
9 CharacterFlyweight goblinFlyweight = flyweightFactory.GetCharacterFlyweight("Goblin", 50, 10);
10 CharacterFlyweight trollFlyweight = flyweightFactory.GetCharacterFlyweight("Troll", 150, 30);
11
12 // ایجاد شخصیتها با استفاده از اشیاء سبک
13 Character orc1 = new Character(orcFlyweight, "Orc Warrior");
14 Character orc2 = new Character(orcFlyweight, "Orc Archer");
15 Character goblin1 = new Character(goblinFlyweight, "Goblin Warrior");
16 Character troll1 = new Character(trollFlyweight, "Troll Shaman");
17 }
18}
در این مثال با استفاده از الگوی Flyweight، توانستیم اشیاء سبک (ویژگیهای مشترک) را به اشتراک بگذاریم و بهینهسازی حافظه را در حوزه بازیسازی انجام دهیم. همچنین، میتوانیم شخصیتهای مختلف را با استفاده از اشیاء سبک ایجاد کنیم که ویژگیهای مشترک را به اشتراک میگذارند و ویژگیهای خاص خود را دارند.