English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تحليل شامل لنمط تصميم Java Singleton

يشارك هذا المقال لكم رمز نموذج الصيغة الفريدة في تصميم Java، للاستفادة منه، والتفاصيل كالتالي

المفهوم:

نموذج الصيغة الفريدة: كائن واحد فقط في الكائن.

يكون لديه كائن واحد فقط، ويقدم نقطة الوصول العالمية.

سبب استخدام هذا النمط:

  عندما نتصفح المواقع، قد تظهر بعض المواقع معلومات "عدد المستخدمين المتصلين حاليًا". عادةً، الطريقة التي يتم بها تنفيذ هذه الوظيفة هي تخزين كل عنوان IP مسجل في ذاكرة التخزين، ملف أو قاعدة بيانات، كلما زاد عنوان IP، يتم تنفيذ "+1". عادةً يتم استخدام طريقة مثل add() لتحقيق وظيفة "+1"، مثل استخدام جملة update للحصول أولاً على البيانات المخزنة في قاعدة البيانات، ثم زيادة 1، وتحديث البيانات في قاعدة البيانات، ثم الحفظ، ثم يمكن عرضها في الصفحة من خلال طريقة أخرى للحصول على البيانات المخزنة في قاعدة البيانات. ولكن، عند تسجيل دخول مستخدمين متعددين في نفس الوقت، إذا كان كل مستخدم يحتاج إلى إنشاء كائن جديد، ثم تنفيذ جملة "كائن.اسم الطريقة" لتنفيذ طريقة add()، ثم حفظ البيانات في قاعدة البيانات، فإن هذا سيؤدي إلى عدم تمكن المستخدمين من تسجيل البيانات الفعلية للمستخدمين في قاعدة البيانات بشكل دقيق. لذا، يتم تصميم هذا المعامل ككائن عالمي (يستخدم الجميع نفس الكائن بدلاً من إنشاء كائن جديد)، حيث يستخدم الجميع نفس البيانات، مما يمكن من تجنب مشاكل مشابهة، وهذا هو أحد تطبيقات نموذج الصيغة الفريدة. 

بالنفس الطريقة، هناك أيضًا مواقف أخرى حيث يمكن أن يواجهك مشهد مشابه، يتم استخدام أفكار مشابهة. مثل:

   1. الموارد الخارجية: لدى كل جهاز كمبيوتر عدد غير محدود من الطابعات، ولكن يجب أن يكون هناك PrinterSpooler واحد فقط لتجنب أن يتم إنشاء طابعتين للنماذج. الموارد الداخلية: لدى معظم البرامج ملفات إعدادات (أو أكثر) تحتوي على تكوين النظام، يجب أن يكون هناك عميل لتحكم في هذه الملفات الإعدادات.
   2. مدير المهام في Windows (Task Manager) هو نموذج الفئة الواحدة المثالي (هل تعرف هذا؟) فكر في ذلك، هل يمكنك فتح اثنين من مديري المهام في Windows؟ لا تتردد في تجربتها.
   3. سلة المهملات في Windows (Recycle Bin) هي تطبيق نموذج الفئة الواحدة. خلال تشغيل النظام كله، يتم حفظ سلة المهملات كنموذج واحد فقط.
   4. معادلة الموقع على الموقع، عادة ما يتم تنفيذ نموذج الفئة الواحدة، لأنه من الصعب التزامن.
   5. تطبيق سجلات التطبيق، عادة ما يتم تنفيذ نموذج الفئة الواحدة، هذا بسبب أن ملف السجلات المشترك دائمًا ما يكون مفتوحًا، لأنه يمكن للفئة الواحدة فقط الوصول إليه، وإلا فإنه لن يكون من الممكن إضافة محتوى.
   6. قراءة объектов التكوين لـ Web التطبيق، عادة ما يتم تطبيق نموذج الفئة الواحدة، هذا بسبب أن ملف التكوين هو مكون مشترك.
   7. تصميم حوض الاتصال بالقاعدة البيانات عادة ما يستخدم نموذج الفئة الواحدة، لأن اتصال القاعدة البيانات هو نوع من موارد قاعدة البيانات. يُستخدم حوض الاتصال بالقاعدة البيانات في نظام البرمجيات الخاص بالقاعدة البيانات لفرض توفير الوقت في فتح أو إغلاق اتصال القاعدة البيانات، هذا الطلب في الوقت هو مكلف جدًا، لأنه يمكن تقليل هذا الطلب بشكل كبير باستخدام نموذج الفئة الواحدة.
   8. تصميم حوض التشغيل المتعدد الأنماط عادة ما يستخدم نموذج الفئة الواحدة، هذا بسبب أن حوض التشغيل يجب أن يكون سهلًا في التحكم في الأنماط الموجودة في الحوض.
   9. نظام الملفات في نظام التشغيل، وهو مثال ملموس على تنفيذ نموذج الفئة الواحدة، يمكن أن يكون لدي نظام تشغيل ملفات واحد فقط.
   10. HttpApplication أيضًا هو تطبيق نموذج الفئة الواحدة. يجب أن يعلم من يفهم دورة الحياة الكاملة للطلب في ASP.Net (IIS) أن HttpApplication أيضًا هي نموذج الفئة الواحدة، وتشارك جميع HttpModule في نفس نموذج HttpApplication. 

بشكل عام، تطبيقات نموذج التقييد العامة تتمثل في:

    1. النماذج التي يجب إنشاؤها وتدميرها بشكل متكرر.

    2. النماذج التي يتم إنشاؤها وتدميرها بشكل كبير في وقت الإنشاء، ولكنها تستخدم بشكل متكرر.

      3. نماذج الأدوات التي تحتوي على حالة.

    4. النماذج التي يتم الوصول إليها بشكل متكرر إلى قاعدة البيانات أو الملفات.

    5. عند استخدام الموارد بشكل مشترك، يمنع من فقدان الأداء أو التلف الذي يمكن أن يسببه عملية التشغيل للموارد. مثل ملفات السجلات والتكوينات التطبيقية.

    6. عند التحكم في الموارد، يسهل التواصل بين الموارد. مثل صندوق السلاسل.

خصائص:

1. يجب أن يتم إنشاء النموذج بشكل متكرر ومحذوف بشكل متكرر.

2. يجب أن تخلق الفئة التقييدية نموذجها الخاص بي بشكل مسبق؛

3. يجب أن تقدم الفئة التقييدية هذا النموذج لجميع الأغراض الأخرى.

مكونات نموذج التقييد: 

   1. بناء بنية مخصصة
   2. مرجع استاتيكي خاص يأخذ النموذج الخاص بي كقيمة مطلقة
   3. طريقة عامة لتقديم النموذج الخاص بي كقيمة مطلقة 

ثلاث طرق لتحقيق نموذج التقييد:

1. نموذج الجوع: يتم بناء نموذج التقييد عند تحميل الفئة، التأهيل المبكر. (الطريقة المسبقة للتحميل)

/**
* نموذج الجوع (الموصى به)
*
*/
public class Test {
    private Test() {
    }
    public static Test instance = new Test();
    public Test getInstance() {
        return instance;
    }
}

النقاط الإيجابية 

    1. الأمان في السلسلة
    2. يتم إنشاء نموذج استاتيكي مسبقًا أثناء تحميل الفئة، السرعة في الاستجابة عند التطبيق.

النقاط السلبية 

    لا تكون كفاءة الموارد عالية، قد لا يتم تنفيذ getInstance() أبدًا، لكن عند تنفيذ طريقة الاستاتيكية الأخرى للفئة أو تحميل الفئة (class.forName)، يتم تأهيل هذا النموذج.

2. السلوك المفتوح: يتم بناء نموذج التقييد في وقت الاستخدام الأول، التأخير في التأهيل.

class Test {
    private Test() {
    }
    public static Test instance = null;
    public static Test getInstance() {
        if (instance == null) {
       //في حالة التحقق من أن instance هو null في عدة سلاسل، قد يحدث تكرار عند تنفيذ عملية new في سلاسل متعددة
            instance = new Singleton2();
        }
        return instance;
    }
}

النقاط الإيجابية 

    يمنع السلوك المفتوح من إنشاء نماذج عند عدم استخدامها، مما يزيد من كفاءة استخدام الموارد، لا يتم إنشاء النموذج عند تنفيذ getInstance()، يمكن تنفيذ طريقة الاستاتيكية الأخرى للفئة.

النقاط السلبية 

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

3. التحقق المزدوج

class Test {
    private Test() {
    }
    public static Test instance = null;
    public static Test getInstance() {
        if (instance == null) {
            synchronized (Test.class) {
                if (instance == null) {
                    instance = new Test();
                }
            }
        }
        return instance;
    }
}

النقاط الإيجابية 

    استخدام الموارد فعال، لا يتم إنشاء المثال إذا لم يتم تنفيذ getInstance()، يمكن تنفيذ جميع الطرق الثابتة للفئة الأخرى

النقاط السلبية 

    لا يُجيب بسرعة كافية عند التحميل للمرة الأولى، بسبب بعض أسباب نموذج ذاكرة Java، قد تفشل في بعض الأحيان

4. الكلاس الداخلي الثابت

class Test {
    private Test() {
    }
    private static class SingletonHelp {
        static Test instance = new Test();
    }
    public static Test getInstance() {
        return SingletonHelp.instance;
    }
}

النقاط الإيجابية 

    استخدام الموارد فعال، لا يتم إنشاء المثال إذا لم يتم تنفيذ getInstance()، يمكن تنفيذ جميع الطرق الثابتة للفئة الأخرى

النقاط السلبية 

    لا يُجيب بسرعة كافية عند التحميل للمرة الأولى

الخلاصة: 

    يُستخدم عادةً نموذج الجوع، وإذا كنت مهتمًا جدًا بالموارد، يمكنك استخدام الكلاس الداخلي الثابت، لا يُنصح باستخدام نموذج الجهل أو التحقق المزدوج

 هذا هو نهاية محتوى المقال، آمل أن يكون هذا المقال مفيدًا للعديد منكم، ونرجو منكم دعم دليل التصفير.

بيان: محتويات هذا المقال تم جمعها من الإنترنت، ويحق للمالك الأصلي الحصول عليها، ويتم جمعها من قبل المستخدمين على الإنترنت بتحميلهم بأنفسهم، لا يملك هذا الموقع حقوق الملكية، ولا يتم تعديل المحتوى يدويًا، ولا يتحمل الموقع أي مسؤولية قانونية تتعلق بذلك. إذا كنت قد وجدت محتوى يشتبه في حقوق النسخ، فنرجو منك إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال #بـ @) للإبلاغ، وقدم الدليل الداعم، وسيقوم الموقع بإزالة المحتوى المشبوه بعد التحقق.

مفضل لك