Flyweight

GOF Intent:
Use sharing to support large numbers of fine-grained objects efficiently.

گاهي تعداد زيادي Object داريم که ماهيت يکساني دارند و از بسياري جهات شبيه يکديگر هستند و تنها تفاوت هاي اندکي با هم دارند. Flyweight در اين شرايط استفاده مي شود و باعث کاهش فضاي حافظه مورد استفاده مي گردد.

مثلا فرض کنيد در يک بازي تعدادي موجود يک شکل حمله کننده داريم و فقط محل قرار گيري آنها و رنگ شان متفاوت است و بقيه مشخصات آنها يکسان است.

مثال معروف ديگر Word processor ها هستند که تعداد زيادي کاراکتر با مشخصات يکسان را در قالب خطوط و سطر و ستون ها به نمايش مي گذارند. يک حرف در جاهاي مختلف متن ممکن است استفاده شود، اما در همه جا شکل و ويژگي هاي يکسان دارد.

Flyweight Pattern مي گويد که به جاي نگهداري خود حرف اشاره گر به آن را نگه داريم. بديهي است در اينجا همه حروف بايد در يک Pool نگهداري شوند.

در اينجا دو مفهوم کليدي وجود دارد:

Intrinsic state: عبارت است از چيزهايي از Object که ثابت هستند و مشخصات ذاتي آن به شمار مي آيند.
Extrinsic state: شامل چيزهايي که ثابت نيستند و از يک Object به Object ديگر تفاوت مي کنند.


Flyweight عبارت است از Object اي است که مشخصه هاي يکسان يا همان Intrinsic state در آن پياده مي شود و بصورت Share مورد استفاده قرار مي گيرد.

Flyeweight در لغت به معني سبک وزن و از اصطلاحات ورزش بوکس است.

دياگرام اين Pattern بدين صورت است:

همانگونه که در دياگرام بالا مي شود ديد، لزومي ندارد که همه Subclass هاي Fiyweight بصورت Share استفاده شوند.

در اين مثال فقط Character لازم است Share شود و نمونه هاي آن از داخل يک pool اختصاص داده شوند.

نمونه کد:
فرض کنيد در يک قهوه خانه، انواع قهوه مثل اسپرسو و کاپوچينو و غيره براي ميزهاي مختلف سرو مي شود.
در اين حالت مي شود به جاي تخصيص دادن يک instance بخصوص براي قهوه در هر سفارش، نوع قهوه را از يک Pool استخراج کرد و تنها شماره ميز را کنارش نگه داشت.

public interface CoffeeOrder {   //Flyweight
   public void serveCoffee(int tableNo);
}


public class CoffeeFlavor implements CoffeeOrder {    //ConcreteFlyweight
   private String flavor;

   public CoffeeFlavor(String newFlavor) {
      flavor = newFlavor;
   }

   public String getFlavor() {
      return this.flavor;
   }

   public void serveCoffee(int tableNo) {
      System.out.println(“Serving Coffee flavor “+flavor+ ” to table number ” + tableNo);
   }
}


public class CoffeeFlavorFactory {   //FlyweightFactory
   private Map flavors = new HashMap();

   public CoffeeFlavor getCoffeeFlavor(String flavorName) {
      CoffeeFlavor flavor = flavors.get(flavorName);
      if (flavor == null) {
         flavor = new CoffeeFlavor(flavorName);
         flavors.put(flavorName, flavor);
      }
      return flavor;
   }
}


public class TestFlyweight {

   private static CoffeeFlavor[] flavors = new CoffeeFlavor[100];

   private static int[] tables = new int[100];

   private static int ordersMade = 0;

   private static CoffeeFlavorFactory flavorFactory;

   public static void takeOrders(String flavorIn, int table) {
      flavors[ordersMade] = flavorFactory.getCoffeeFlavor(flavorIn);
      tables[ordersMade++] = table;
   }


   public static void main(String[] args) {
      flavorFactory = new CoffeeFlavorFactory();

      takeOrders(“Cappuccino”, 2);
      takeOrders(“Cappuccino”, 2);
      takeOrders(“Xpresso”, 1);
      takeOrders(“Cappuccino”, 97);
      takeOrders(“Cappuccino”, 97);
      takeOrders(“Frappe”, 3);
      takeOrders(“Xpresso”, 3);
      takeOrders(“Cappuccino”, 3);
      takeOrders(“Frappe”, 552);

      for (int i = 0; i < ordersMade; ++i) {
         flavors[i].serveCoffee(tables[i]);
      }
   }
}



Multitone Pattern
با توجه بيشتر به پياده سازي Flyweight Factory شباهت هايي بين آن و Singleton Pattern مي بينيم. کلاس هاي از اين دست را Multiton مي نامند. در Multiton نمونه ها بصورت زوج کليدهايي نگهداري مي شوند و بر اساس Key دريافت شده نمونه متناظر بازگردانده مي شود.

تفاوت Singleton و Multiton:
در Singleton تضمين مي شود که از کلاس مربوطه فقط يک نمونه در کل Application وجود دارد.
در Multiton Pattern تضمين مي‌شود که براي هر Key تنها يک Instance وجود دارد.



منبع ها:

  1. Design Patterns – Elements of Reusable Object Oriented Software (GOF) By Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
  2. Flyweight in Wikipedia
  3. Flyweight in Devlake
  4. Multiton in Wikipedia

پست شده در دسته‌بندی نشده

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*


4 + چهار =

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

تماس با من: admin@paspars.com