هذه المقالة موجهة إلى أي شخص، لأول مرة، يواجه مفهوم أنماط التصميم، أو سمع المصطلح Singleton ، أو قام بطريقة ما بتنفيذ النمط الفردي ولكنه لم يفهم ما كان يحدث. مرحباً! يواجه طلاب CodeGym أنماط التصميم لأول مرة في المستوى 15، عندما يطلب منهم الكابتن بشكل غير متوقع "تعزيز" فهمهم من خلال تنفيذ نمط Java Singleton مع التنفيذ البطيء. الطلاب الذين يسمعون عن النمط الفردي لأول مرة لديهم على الفور الكثير من الأسئلة: ما هو نمط التصميم في العالم؟ لماذا نحتاجه؟ ما هو المفرد ؟ وأخيرًا، ما هو التنفيذ البطيء؟ دعونا نجيب على هذه الأسئلة بالترتيب.
والنمط الفردي هو مجرد واحد منهم.
باستخدام لعبة البلاك جاك والأرقام وقضاء الكثير من الوقت في القيام بذلك، أو يمكنك تنفيذ خوارزمية تم فهمها ووصفها لفترة طويلة. وينطبق الشيء نفسه على أنماط التصميم. بالإضافة إلى ذلك، مع أنماط التصميم، تصبح التعليمات البرمجية أكثر معيارية، وعند استخدام النمط المناسب، تقل احتمالية ارتكاب الأخطاء، حيث تم تحديد المخاطر الشائعة للنمط والقضاء عليها منذ فترة طويلة. علاوة على كل شيء آخر، تساعد معرفة الأنماط المبرمجين على فهم بعضهم البعض بشكل أفضل. يمكنك ببساطة قول اسم النمط بدلاً من محاولة تقديم شرح مطول لزملائك المبرمجين. خلاصة القول، أنماط التصميم تساعدك على:
في ختام هذا القسم، نلاحظ أنه يمكن تقسيم كامل أنماط التصميم إلى ثلاث مجموعات كبيرة:
ما في العالم هو نمط التصميم؟
أعتقد أن القليل من التاريخ هو من أجل الإجابة على هذا السؤال بأفضل فهم. هناك أربعة مؤلفين برمجيين مشهورين (إريك جاما، جون فليسيدس، رالف جونسون، وريتشارد هيلم) الذين توصلوا إلى فكرة مثيرة للاهتمام. لقد لاحظوا أن تطوير البرمجيات غالبًا ما يتطلب منهم حل نفس المشكلات تقريبًا وكتابة التعليمات البرمجية المنظمة بنفس الطريقة. لذلك قرروا وصف الأنماط النموذجية التي غالبًا ما يلزم استخدامها في البرمجة الموجهة للكائنات. نُشر كتابهم في عام 1994 تحت عنوان أنماط التصميم: عناصر البرامج الموجهة للكائنات القابلة لإعادة الاستخدام. تبين أن اسم الكتاب طويل جدًا وبدأ الناس يطلقون عليه ببساطة اسم كتاب عصابة الأربعة. تضمنت الطبعة الأولى 23 نمطًا. وبعد ذلك تم اكتشاف العشرات من الأنماط الأخرى. لذلك دعونا نلخص إجابة سؤال هذه الفقرة (ما هي أنماط التصميم في العالم؟) في بضع كلمات:نمط التصميم هو حل موحد لمشكلة شائعة. |
لماذا نحتاج إلى أنماط التصميم؟
يمكنك البرمجة دون معرفة الأنماط: فبعد كل شيء، بحلول المستوى 15، تكون قد كتبت بالفعل مئات البرامج المصغرة على CodeGym دون حتى معرفة وجودها. يشير هذا إلى أن أنماط التصميم هي نوع من الأدوات التي يميز استخدامها المعلم عن الهواة: أنماط التصميم تصف كيفية حل مشكلة نموذجية بشكل صحيح. وهذا يعني أن معرفة الأنماط توفر عليك الوقت. وبهذه الطريقة، فهي تشبه الخوارزميات. على سبيل المثال، يمكنك إنشاء خوارزمية فرز خاصة بك
|
وأخيرا، نمط المفردة
Singleton هو نمط إبداعي . يضمن هذا النمط وجود مثيل واحد فقط للفئة ويوفر نقطة وصول عامة لهذا الكائن. ويتبين من الوصف أن هذا النمط يجب أن يطبق في حالتين:- عندما يتطلب برنامجك عدم إنشاء أكثر من كائن واحد لفئة معينة. على سبيل المثال، قد تحتوي لعبة كمبيوتر على فئة Hero وكائن Hero واحد فقط يصف البطل الوحيد في اللعبة.
- عندما تحتاج إلى توفير نقطة للوصول الشامل إلى كائن ما. بمعنى آخر، تحتاج إلى إتاحة الكائن من أي مكان في البرنامج. للأسف، لا يكفي إنشاء متغير عام ببساطة، لأنه ليس محميًا ضد الكتابة: يمكن لأي شخص تغيير قيمة المتغير، لذلك قد يتم فقدان نقطة الوصول العامة للكائن. تعتبر خصائص Singleton هذه ضرورية، على سبيل المثال، عندما يكون لديك كائن يعمل مع قاعدة بيانات، وتحتاج إلى الوصول إلى قاعدة البيانات من أجزاء مختلفة من البرنامج. سيضمن Singleton عدم قيام أي شخص بكتابة تعليمات برمجية تحل محل المثيل الذي تم إنشاؤه مسبقًا .
-
ابحث عن مثال لـ Singleton مع التهيئة البطيئة.
-
قم بإنشاء ثلاث فئات مفردة - الشمس والقمر والأرض - في ملفات منفصلة باستخدام نفس المبدأ.
-
ينفذكوكبواجهة في فئات الشمس والقمر والأرض .
- في الكتلة الثابتة لفئة الحل ، قم باستدعاءreadKeyFromConsoleAndInitPlanetطريقة.
-
تنفيذreadKeyFromConsoleAndInitPlanetوظيفة الطريقة:
-
5.1. قراءة معلمة سلسلة واحدة من وحدة التحكم
-
5.2. إذا كانت المعلمة تساوي أحدكوكبثوابت الواجهة، قم بإنشاء كائن الكوكب المناسب .
-
-
تحتاج إلى منح الفصل حقلًا ثابتًا خاصًا يخزن كائنًا واحدًا:
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; // #1 }
-
اجعل المُنشئ (الافتراضي) خاصًا. هذا يعني أنه لا يمكن الوصول إليه خارج الفصل ولن يتمكن من إرجاع كائنات جديدة:
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton(){} // #2 }
-
أعلن عن طريقة إنشاء ثابتة سيتم استخدامها للحصول على المفردة:
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton() {} public static LazyInitializedSingleton getInstance() { // #3 if (instance == null) { // If the object has not yet been created instance = new LazyInitializedSingleton(); // Create a new object } return instance; // Return the previously created object } }
GO TO FULL VERSION