آشنایی با الگوی طراحی Fly Weight
نویسنده: وحید فرهمندیان
تاریخ: ۱۳۹۳/۱۲/۰۵ ۱۴:۲۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public interface IAlphabet
{
void Render(string font);//Define Extrinsic and non-static states for each object
}
public class A : IAlphabet
{
public void Render(string font) { Console.WriteLine(GetType().Name + " has font of type " + font); }
}
public class B : IAlphabet
{
public void Render(string font) { Console.WriteLine(GetType().Name + " has font of type " + font); }
} public class FlyWeightFactory
{
private readonly Dictionary<string, IAlphabet> _dictionary = new Dictionary<string, IAlphabet>();
public int Count { get { return _dictionary.Count; } }
public IAlphabet GetObject(string name)
{
if (!_dictionary.ContainsKey(name))
switch (name)
{
case "A":
_dictionary.Add(name, new A());
Console.WriteLine("New object created");
break;
case "B":
_dictionary.Add(name, new B());
Console.WriteLine("New object created");
break;
default:
throw new Exception("Factory can not create given object");
}
else
Console.WriteLine("Object reused");
return _dictionary[name];
}
} FlyWeightFactory flyWeightFactory = new FlyWeightFactory();
IAlphabet alphabet = flyWeightFactory.GetObject(typeof(A).Name);
alphabet.Render("Arial");
Console.WriteLine();
alphabet = flyWeightFactory.GetObject(typeof(B).Name);
alphabet.Render("Tahoma");
Console.WriteLine();
alphabet = flyWeightFactory.GetObject(typeof(A).Name);
alphabet.Render("Time is New Roman");
Console.WriteLine();
alphabet = flyWeightFactory.GetObject(typeof(A).Name);
alphabet.Render("B Nazanin");
Console.WriteLine();
Console.WriteLine("Total new alphabet count:" + flyWeightFactory.Count);
نکتهی قابل توجه این است که این الگو بصورت داخلی از الگوی Factory Method استفاده میکند. با توجه بیشتر به پیاده سازی Flyweight Factory شباهت هایی بین آن و Singleton Pattern میبینیم. کلاسهایی از این دست را Multiton می نامند. در Multiton نمونهها بصورت زوج کلیدهایی نگهداری میشوند و بر اساس Key دریافت شده نمونهی متناظر بازگردانده میشود. همچنین در Singleton تضمین میشود که از کلاس مربوطه فقط یک نمونه در کل Application وجود دارد. در Multiton Pattern تضمین میشود که برای هر Key تنها یک Instance وجود دارد.