فصل Singleton في Java - كيفية استخدام فئة Singleton؟



تتحدث هذه المقالة عن Singleton Class في Java عن الطرق المختلفة التي يمكن من خلالها جعل الفصل Singleton جنبًا إلى جنب مع التطبيقات العملية.

في Java ، الفئة المنفردة هي فئة يمكن أن تحتوي على مثيل واحد فقط في وقت معين. إنه أحد أنماط التصميم الإبداعي الخمسة في Java والتي تساعد في تطوير ملفات . من خلال وسيط هذه المقالة ، سأقدم لك رؤى واضحة حول ما هو الفصل الفردي في Java وكيف يمكنك إنشاؤه.

فيما يلي الموضوعات التي سأغطيها في هذه المقالة:





جافا إنشاء مجموعة من الكائنات

هيا بنا نبدأ.

ما هو فصل Singleton في جافا؟

من الناحية العادية ، فإن فئة Singleton في Java هي الفئة التي تتيح الوصول إليها من خلال مثيل واحد في كل مرة. نمط التصميم هذا مخصص لتقييد إنشاء مثيل غير ضروري لفئة والتأكد من وجود فئة واحدة فقط موجود في أي وقت لكل مثيل JVM. وبالتالي ، مع هذا النمط ، فإن أي فئة يتم تعريفها على أنها Singleton لها مثيل واحد فقطمع نقطة وصول عالمية إليه. على عكس الفصول العادية ، لا يتم تدمير الفصل الفردي بنهاية دورة حياة التطبيقات.



لكن لماذا نحتاج إلى فصل فردي في المقام الأول؟

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

آمل أن تكون واضحًا في مفهوم فئة Singleton في Java. لذا ، دعنا الآن نواصل المزيد في هذافصل Singleton في مقالة Java وانظر كيف يتم إنشاؤها.



طرق تصميم فئة Java Singleton

من أجل جعل فصل دراسي منفردًا في Java ، فأنت بحاجة إلى الأشياء الثلاثة التالية:

  1. عضو ثابت في الفصل
  2. مُنشئ خاص
  3. طريقة المصنع الثابت

نظرًا لأن Java تتيح للمطورين استكشاف آفاقهم ، فهناكعدد من الطرق التي يمكنك من خلالها تصميم فصل فردي. أدناه قمت بإدراج أكثرها شعبية.

  1. طريقة التهيئة الحريصة
  2. طريقة التهيئة الكسولة
  3. طريقة سينجلتون الآمنة
  4. التهيئة الكسولة بطريقة القفل المزدوج
  5. طريقة التحميل الكسول
  6. طريقة بدء الكتلة الثابتة

دعنا الآن نتعمق في كل من هذه الأساليب واحدًا تلو الآخر.

1. طريقة التهيئة حريصة

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

  1. إعلان المُنشئ خاصًا.
  2. الخطوة التالية هي إنشاء عضو فصل خاص لفصل Singleton.
  3. الآن ، أنت بحاجة إلى تحديد طريقة المصنع التي سيتم استخدامها لإرجاع كائن الفصل الخاص بك ، والذي أنشأناه كمثيل لعضو الفصل.
  4. يمكنك حتى إعلان عضو ثابت عام إذا كنت تريد الوصول إلى هذا المثيل الثابت مباشرة.

الآن ، دعونا نرى كيفية تنفيذ هذه.

// Eager Initialization public class EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton () private EagerSingleton () {} public static EagerSingleton getInstance () {return INSTANCE}}

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

لذا ، دعونا نمضي قدمًا ونرى طريقة أخرى لإنشاء فصل دراسي فردي في Java.

2. طريقة التهيئة الكسولة

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

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

يوضح الكود أدناه كيفية القيام بذلك.

// Lazy Initialization public class LazySingleton {private static LazySingleton INSTANCE = null private LazySingleton () {} public static LazySingleton getInstance () {if (INSTANCE == null) {synized (LazySingleton.class) {INSTANCE = new LazySingleton ()}} عودة INSTANCE}}

3. الخيط الآمن المفرد طريقة

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

ما هو الفرق بين javascript و jquery
// Thread SafeSingleton public class ThreadSafeSingleton {private static ThreadSafeSingleton INSTANCE private ThreadSafeSingleton () {} عام ثابت متزامن ThreadSafeSingleton getInstance () {if (INSTANCE == null) {INSTANCE = new ThreadSafeSingleton ()} return INSTANCE}}

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

4. تهيئة كسول مع قفل مزدوج طريقة

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

// Lazy Initialization with Double Lock public class LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton () {} عام ثابت LazyDoubleLockSingleton getInstance () {if (INSTANCE == null) {متزامن (ifyDoubleLockSing) null) {INSTANCE = new LazyDoubleLockSingleton ()}}} عودة INSTANCE}}

5. طريقة التحميل الكسول

تعتمد هذه الطريقة على JSL (مواصفات لغة Java) ووفقًا لذلك سيتم تحميل أعضاء البيانات الثابتة فقط عندما تكون مطلوبة. وبالتالي ، عندما يتم تحميل الفصل الفردي الخاص بك في JVM ، لا يتم إنشاء مثيل. علاوة على ذلك ، أثناء تنفيذ البرنامج ، يتم استدعاء الطريقة العالمية بترتيب تسلسلي. باستخدام هذه الطريقة ، لا يتعين عليك مزامنة getInstance () الثابت بشكل صريح للتحميل والتهيئة. سيتم استدعاء عضو الفئة الثابتة بطريقة متسلسلة مناسبة ، ويتم إرجاع بقية الاستدعاءات المتزامنة للطريقة العامة بنفس الترتيب دون الحاجة إلى إجراء المزامنة الزائدة.

يوجد أدناه رمز لأداء نفس الشيء.

// Lazy Load Method public class LazyLoadSingleton {private LazyLoadSingleton () {} فئة ثابتة خاصة SingletonClassHolder {static final Var INSTANCE = new LazyLoadSingleton ()} عامة ثابتة LazyLoadSingleton getInstance () {return SingletonClassHolder.INSTANCE}}

6. طريقة بدء الكتلة الثابتة

هذه الطريقة لإنشاء فئة فردية في Java هيعلى غرار طريقة التهيئة حريصة. الاختلاف الوحيد هو أن مثيل هذه الفئة يتم إنشاؤه داخل الكتلة الثابتة التي لها وظائف.

// Static Block Initialization public class StaticBlockSingleton {private static StaticBlockSingleton INSTANCE private StaticBlockSingleton () {} // معالجة الاستثناء داخل الكتلة الثابتة الثابتة {try {INSTANCE = new StaticBlockSingleton ()} catch (Exception e) {throw new RuntimeException ('Exception occured أثناء إنشاء فئة Singleton ')}} عامة ثابتة StaticBlockSingleton getInstance () {return INSTANCE}}

هذا يقودنا إلى نهاية هذه المقالة عن فصل Singleton في Java. إذا كنت تريد معرفة المزيد عن Java ، يمكنك الرجوع إلى موقعنا .

الآن بعد أن فهمت ما هو فصل Singleton في Java ، تحقق من من Edureka ، شركة تعليمية موثوقة عبر الإنترنت مع شبكة تضم أكثر من 250.000 متعلم راضٍ منتشرين في جميع أنحاء العالم تم تصميم دورة تدريب وشهادة Java J2EE و SOA من Edureka للطلاب والمهنيين الذين يرغبون في أن يصبحوا مطوري Java. تم تصميم الدورة التدريبية لمنحك السبق في برمجة Java وتدريبك على مفاهيم Java الأساسية والمتقدمة جنبًا إلى جنب مع العديد من أطر Java مثل Hibernate & Spring.

لديك سؤال لنا؟ يرجى ذكر ذلك في قسم التعليقات بمقال 'Singleton Class in Java' وسنعاود الاتصال بك في أقرب وقت ممكن.