# نمط المفرد

في هندسة البرمجيات، يعد النمط المفرد أو الاحادي (بالإنجليزية: singleton pattern)‏ نمط تصميم برامجيات يقيد إنشاء مثيل برمجي لصنف واحد بمثيل «احادي». مفيد عندما تكون هناك حاجة إلى كائن واحد بالضبط لتنسيق الإجراءات عبر النظام. المصطلح يأتي من المفهوم الرياضي للأحادي.
يعتبر النقاد أن المفرد هو نمط مضاد لأنه يستخدم بشكل متكرر في السيناريوهات حيث لا يكون مفيدًا، ويقدم قيودًا غير ضرورية في المواقف التي لا يكون فيها مثيل برمجي وحيد للصنف مطلوبًا بالفعل، ويدخل الحالة البرمجية العامة في التطبيق.

## نظرة عامة

يُعد نمط التصميم المفرد أحد أنماط التصميم الثلاثة والعشرون المعروفة باسم "عصابة الأربعة" التي تصف كيفية حل مشكلات التصميم المتكررة لتصميم برامج كائنية التوجه قابلة لإعادة الاستخدام ومرنة، أي الكائنات التي يسهل فيها التنفيذ البرمجي والتغيير والاختبار وإعادة الاستخدام.
يحل نمط التصميم الفردي مشاكل مثل:
* كيف يمكن التأكد من أن الصنف لديه مثيل برمجي واحد فقط؟
* كيف يمكن الوصول إلى المثيل الوحيد الصنف بسهولة؟
* كيف يمكن الصنف التحكم في تمثيها البرمجي؟
* كيف يمكن تقييد عدد أمثال الصنف؟
يصف نمط التصميم الفردي كيفية حل هذه المشاكل:
* إخفاء مُنشئ الصنف.
* قم بتعريف عملية ثابتة عامة برمجياً (بالإنجليزية: public static)‏ (getInstance) تقوم بإرجاع برمجي (بالإنجليزية: returns)‏ المثيل الاحادي للصنف.
الفكرة الرئيسية في هذا النمط هي جعل الصنف نفسه مسؤول عن التحكم في استنساخه (التي يتم استنساخه مرة واحدة فقط). يضمن المُنشئ المخفي (المُعلن بوصول خاص (بالإنجليزية: declared private)‏) أنه لا يمكن إنشاء مثيل الصنف على الإطلاق من خارج الصنف. يمكن الوصول إلى العملية الثابتة العامة البرمجية بسهولة باستخدام اسم الصنف واسم العملية (Singleton.getInstance).

## الاستخدامات الشائعة

* يمكن للمصنع المجرد، طريقة المصنع، والباني، وأنماط النموذج الأولي استخدام الانماط الاحادية في تنفيذها.
* غالبًا ما تكون كائنات الواجهة احادية لأن كائن واجهة واحد فقط مطلوب.
* غالبًا ما تكون كائنات الحالة احادية.
* غالبًا ما تُفضل الأنماط المفردة على المتغيرات العامة للأسباب التالية:
** فهي لا تلوث مساحة الاسم العامة (بالإنجليزية: global namespace)‏ (أومساحة الاسم التي تحتوي عليها، في اللغات ذات مساحات الأسماء المتداخلة) بمتغيرات غير ضرورية.
** أنها تسمح بالتخصيص البطيء للذاكرة والتهيئة، في حين أن المتغيرات العامة في العديد من اللغات سوف تستهلك دائما الموارد المتاحة.

## التنفيذ

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

### تنفيذ جافا
#### التهيئة البطيئة

قد ينفذ نمط الاحادي التهيئة البطيئة (بالإنجليزية: Lazy initialization)، حيث يتم إنشاء المثيل عندما يتم استدعاء الطريقة الثابتة برمجياً لأول مرة. إذا كان من الممكن استدعاء الطريقة الثابتة من خيوط متعددة (بالإنجليزية: Multiple threads)‏ بشكل متزامن، فقد يلزم اتخاذ تدابير لمنع ظروف السباق التي قد تؤدي إلى إنشاء مثيلات برمجية متعددة من الصنف. ما يلي هو تنفيذ نموذج سلامة الخيوط (بالإنجليزية: thread-safe)‏، باستخدام التهيئة البطيئة مع القفل المزدوج (بالإنجليزية: double-checked locking)‏، المكتوب بلغة جافا.

### تنفيذ سي شارب

في سي شارب، يمكنك أيضًا استخدام أصناف ثابتة لإنشاء أنماط احادية، حيث يكون الصنف نفسه هو نمط احادي.

### تنفيذ كوتلن

الكلمة المفتاحية لكائن كوتلن object يعلن برمجياً عن صنف من النمط الاحادي.

### تنفيذ دلفي وفريباسكال

GetInstance الدالة عبارة عن تنفيذ خيوط حاسوبي آمن للنمط البرمجي الاحادي.
طريقة الاستخدام هي كالتالي: