يهدف أحد الأنماط الهيكلية إلى تقليل استخدام الذاكرة من خلال مشاركة أكبر قدر ممكن من البيانات مع كائنات مماثلة.
إنه مفيد بشكل خاص عند التعامل مع عدد كبير من الكائنات المتشابهة، حيث سيكون إنشاء مثيل جديد لكل كائن مكلفًا من حيث استهلاك الذاكرة.
المفاهيم الأساسية:
الحالة الجوهرية: الحالة المشتركة بين كائنات متعددة مستقلة عن السياق وتظل كما هي عبر كائنات مختلفة.
الحالة الخارجية: الحالة الفريدة لكل كائن ويتم تمريرها من العميل. يمكن أن تختلف هذه الحالة ولا يتم تخزينها في كائن وزن الذبابة
المشاركين الرئيسيين:
وزن الذبابة: الواجهة التي يستقبل بها كائن وزن الذبابة الحالة الخارجية ويستخدمها.
وزن الذبابة الخرسانية: ينفذ وزن الذبابة ويخزن الحالة الجوهرية.
FlyweightFactory: يدير كائنات Flyweight ويضمن مشاركة الواجهات، ويعيد وزن الذبابة الموجود إذا كان موجودًا بالفعل.
العميل (مثل الفئة الرئيسية): يحتفظ بمرجع إلى وزن الذبابة ويوفر حالة خارجية عندما يحتاج إلى التفاعل مع كائن وزن الذبابة.
لنأخذ مثالاً لكائن ذو وزن الذبابة
لنفترض أن لدينا محرر نصوص يحتاج إلى عرض كمية كبيرة من النص. يمكن تمثيل كل شخصية ككائن، ولكن وجود كائن منفصل لكل شخصية قد يؤدي إلى إضاعة الكثير من الذاكرة. بدلاً من ذلك، يمكننا استخدام Flyweights لمشاركة كائنات الأحرف التي تمثل كل حرف، وتخزين الحالة الخارجية مثل الموضع أو التنسيق الخارجي
وزن الذبابة
public interface Flyweight { public void display(int x, int y);//x, y are the extrinsic state of the Flyweight object }
وزن الذبابة الخرسانية
public class CharacterFlyweight implements Flyweight { private char ch; public CharacterFlyweight(char c){ this.ch = c; } @Override public void display(int x ,int y){ System.out.println("[drawing character: " this.ch " at co-ordinates:(" x "," y ")]"); } }
مصنع وزن الذبابة
public class FlyweightFactory { private static HashMapflyweights = new HashMap(); public static Flyweight getFlyweight(char c){ Flyweight flyweight = flyweights.getOrDefault(c,null); if(null==flyweight){ flyweight = new CharacterFlyweight(c); flyweights.put(c,flyweight); } return flyweight; } }
رئيسي
public class Main { public static void main(String args[]){ Flyweight flyweight1 = FlyweightFactory.getFlyweight('a'); Flyweight flyweight2 = FlyweightFactory.getFlyweight('b'); Flyweight flyweight3 = FlyweightFactory.getFlyweight('a');// will use the same object that is referenced by flyweight1 flyweight1.display(1, 2);//'a' displayed at 1,2 flyweight2.display(3, 4);//'b' displayed at 3,4 flyweight3.display(5, 7); // 'a'(shared) displayed at 5,7 } }
الإخراج:
[drawing character: a at co-ordinates:(1,2)] [drawing character: b at co-ordinates:(3,4)] [drawing character: a at co-ordinates:(5,7)]
النقاط الرئيسية
العيوب
التعقيد: يمكن أن يضيف النمط تعقيدًا إلى التعليمات البرمجية، خاصة في إدارة الحالات الخارجية والجوهرية بشكل منفصل.
الحمل الزائد: إذا كان هناك عدد قليل من الكائنات للمشاركة، فقد يؤدي نمط وزن الذبابة إلى تعقيد غير ضروري دون توفير كبير في الذاكرة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3