"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > وزن الذبابة

وزن الذبابة

تم النشر بتاريخ 2024-11-06
تصفح:534

Flyweight

يهدف أحد الأنماط الهيكلية إلى تقليل استخدام الذاكرة من خلال مشاركة أكبر قدر ممكن من البيانات مع كائنات مماثلة.
إنه مفيد بشكل خاص عند التعامل مع عدد كبير من الكائنات المتشابهة، حيث سيكون إنشاء مثيل جديد لكل كائن مكلفًا من حيث استهلاك الذاكرة.
المفاهيم الأساسية:
الحالة الجوهرية: الحالة المشتركة بين كائنات متعددة مستقلة عن السياق وتظل كما هي عبر كائنات مختلفة.
الحالة الخارجية: الحالة الفريدة لكل كائن ويتم تمريرها من العميل. يمكن أن تختلف هذه الحالة ولا يتم تخزينها في كائن وزن الذبابة

المشاركين الرئيسيين:

وزن الذبابة: الواجهة التي يستقبل بها كائن وزن الذبابة الحالة الخارجية ويستخدمها.
وزن الذبابة الخرسانية: ينفذ وزن الذبابة ويخزن الحالة الجوهرية.
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 HashMap flyweights = 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)]

النقاط الرئيسية

  • كفاءة الذاكرة: يقلل من استخدام الذاكرة من خلال مشاركة الكائنات، خاصة عندما تكون الحالة الجوهرية كبيرة أو هناك العديد من الكائنات.
  • تحسين الأداء: تقليل عدد الكائنات التي تم إنشاؤها، يمكن أن يحسن أداء التطبيق عند إدارة أعداد كبيرة من الكائنات.

العيوب
التعقيد: يمكن أن يضيف النمط تعقيدًا إلى التعليمات البرمجية، خاصة في إدارة الحالات الخارجية والجوهرية بشكل منفصل.
الحمل الزائد: إذا كان هناك عدد قليل من الكائنات للمشاركة، فقد يؤدي نمط وزن الذبابة إلى تعقيد غير ضروري دون توفير كبير في الذاكرة.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/prashantrmishra/flyweight-3k4b?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3