نمط المفرد
المحتويات

قبل الخوض في التفاصيل، في هندسة البرمجيات، يعد النمط المفرد أو الاحادي نمط تصميم برامجيات يقيد إنشاء مثيل برمجي لصنف واحد بمثيل «احادي». مفيد عندما تكون هناك حاجة إلى كائن واحد بالضبط لتنسيق الإجراءات عبر النظام. المصطلح يأتي من المفهوم الرياضي للأحادي. وتعرض الأقسام التالية جوانب أخرى من الموضوع.
ومن ناحية أخرى، يعتبر النقاد أن المفرد هو نمط مضاد لأنه يستعمل بشكل متكرر في السيناريوهات حيث لا يكون مفيدًا، ويقدم قيودًا غير ضرورية في المواقف التي لا يكون فيها مثيل برمجي وحيد للصنف مطلوبًا بالفعل، ويدخل الحالة البرمجية العامة في التطبيق.
الاستخدامات الشائعة
ومن ناحية أخرى، أنها تسمح بالتخصيص البطيء للذاكرة والتهيئة، في حين أن المتغيرات العامة في الكثير من اللغات سوف تستهلك دائما الموارد المتاحة.
- غالبًا ما تكون كائنات الواجهة احادية لأن كائن واجهة واحد فقط مطلوب.
- غالبًا ما تكون كائنات الحالة احادية.
- غالبًا ما تُفضل الأنماط المفردة على المتغيرات العامة للأسباب التالية:
وعلى صعيد آخر، يمكن للمصنع المجرد، طريقة المصنع، والباني، وأنماط النموذج الأولي استخدام الانماط الاحادية في تنفيذها.
إضافةً إلى ذلك، فهي لا تلوث مساحة الاسم العامة (أومساحة الاسم التي تحتوي عليها، في اللغات ذات مساحات الأسماء المتداخلة) بمتغيرات غير ضرورية. [4]
}
إضافةً إلى ذلك، } في سي شارب، يمكنك كذلك استخدام أصناف ثابتة لإنشاء أنماط احادية، حيث يكون الصنف نفسه هو نمط احادي. public static class Singleton {
- private static readonly MyOtherClass INSTANCE = new MyOtherClass;
- public static MyOtherClass Instance {
- get {
- return INSTANCE;
- }
- }
- }
- تنفيذ لغة دارت
- class Singleton {
FreeAndNil(FCriticalSection);
كذلك، end. طريقة الاستخدام هي كالتالي: procedure TForm3.btnCreateInstanceClick(Sender: TObject);
- var
- i: integer;
- begin
- for i := 0 to 5 do
- ShowMessage(DateTimeToStr(GetInstance.CreationTime));
- end;
ملحق: مسرد المصطلحات الإنجليزية
وعلى صعيد آخر، المقدمةنمط تصميم برامجيات software design patternإنشاء مثيل برمجي instantiation لصنفclass «احادي» singleاحاديsingletonنمط مضادanti-patternالحالة البرمجية العامةGlobal variablesعصابة الأربعة (الأنماط البرمجية)"Gang of Four" design patternsتنفيذ برمجيimplement منشىْ الصنفthe constructor of the classتعريف برمجيDefineخاصية الثبات بالنسبة للصنفstaticخاصية حالة الوصول عامةpublicمثيل احادي للصنفsole instance of the classخاصية حالة الوصول الخاصprivateصنف من النمط الاحاديsingleton classالكلمة المفتاحية لكائن كوتلنKotlin object keyword يعلن برمجياًdeclaresتنفيذ خيوط حاسوبي أمنthread safe implementationفريباسكالFree Pascalللمصنع المجردabstract factoryطريقة المصنع factory methodأنماط النموذج الأولي prototypeالانماط الاحاديةSingletonsواجهة Facade كائنات الحالةState objectsالمتغيرات العامةglobal variables التخصيص والتهيئةlazy allocation and initializationمساحات الأسماء المتداخلة nested namespacesموادر برمجيةresourcesالتنفيذImplementationالوصول العام global accessالمثيل البرمجيinstanceبنائات constructors تهيئة بطيئةLazy initialization
المراجع
ملاحظات
تنفيذ دلفي وفريباسكال
- GetInstance الدالة عبارة عن تنفيذ خيوط حاسوبي آمن للنمط البرمجي الاحادي.
- unit SingletonPattern;
- interface
- type
- TTest = class sealed
- strict private
- FCreationTime: TDateTime;
- public
- constructor Create;
- property CreationTime: TDateTime read FCreationTime;
- end;
- function GetInstance: TTest;
- implementation
- uses
- SysUtils
- , SyncObjs
- ;
- var
- FCriticalSection: TCriticalSection;
- FInstance: TTest;
- function GetInstance: TTest;
- begin
- FCriticalSection.Acquire;
- try
- if not Assigned(FInstance) then
- FInstance := TTest.Create;
- Result := FInstance;
- finally
- FCriticalSection.Release;
- end;
- end;
- constructor TTest.Create;
- begin
- inherited Create;
- FCreationTime := Now;
- end;
- initialization
- FCriticalSection := TCriticalSection.Create;
- finalization
نظرة عامة
وفي هذا السياق، قم بتعريف عملية ثابتة عامة برمجياً (getInstance) تقوم بإرجاع برمجي المثيل الاحادي للصنف.
- يحل نمط التصميم الفردي مشاكل مثل:
- كيف يمكن التأكد من أن الصنف لديه مثيل برمجي واحد فقط؟
- كيف يمكن الوصول إلى المثيل الوحيد الصنف بسهولة؟
- كيف يمكن الصنف التحكم في تمثيها البرمجي؟
- كيف يمكن تقييد عدد أمثال الصنف؟
- يصف نمط التصميم الفردي كيفية حل هذه المشاكل:
- إخفاء مُنشئ الصنف.
وفي هذا الصدد، يُعد نمط التصميم المفرد أحد أنماط التصميم الثلاثة والعشرون المعروفة باسم "عصابة الأربعة" التي تصف كيفية حل مشكلات التصميم المتكررة لتصميم برامج كائنية التوجه قابلة لإعادة الاستخدام ومرنة، أي الكائنات التي يسهل فيها التنفيذ البرمجي والتغيير والاختبار وإعادة الاستخدام.
ومن جهة أخرى، الفكرة الرئيسية في هذا النمط هي جعل الصنف نفسه مسؤول عن التحكم في استنساخه (التي يتم استنساخه مرة واحدة فقط). يضمن المُنشئ المخفي (المُعلن بوصول خاص ) أنه لا يمكن إنشاء مثيل الصنف على الإطلاق من خارج الصنف. يمكن الوصول إلى العملية الثابتة العامة البرمجية بسهولة باستخدام اسم الصنف واسم العملية (Singleton.getInstance).
التنفيذ
- تنفيذ جافا
- public class Coin {
- private static final int ADD_MORE_COIN = 10;
- تنفيذ النمط المفرد يجب أن يتبع التالي:
- التأكد من وجود مثيل برمجي واحد فقط من صنف النمط الفردي؛ و
- توفير الوصول العام إلى هذا المثيل البرمجي.
- عادة، يتم ذلك عن طريق:
- الإعلان البرمجي عن بنائات الصنف لتكون بحالة الوصول الخاص. و
- توفير طريقة ثابتة برمجياً تقوم بإرجاع عنوان برمجي كمرجع إلى المثيل.
من جانب آخر، يتم تخزين المثيل عادة كمتغير ثابت خاص برمجياً؛ يتم إنشاء المثيل عند تهيئة المتغير، في مرحلة ما قبل استدعاء الدالة الثابتة برمجياً لأول مرة. فيما يلي نموذج تنفيذ مكتوب بلغة جافا.
// private
- // وضع وصول خاص لمنع اي شخص من انشاء مثيل برمجي
- }
- public static Coin getInstance{
- return instance;
- }
- public int getCoin{
- return coin;
- }
- public void addMoreCoin{
- coin += ADD_MORE_COIN;
- }
- public void deductCoin{
- coin--;
- }
- }
private int coin;
private Coin{
من جهة ثانية، private static Coin instance = new Coin; // تحميل باسرع وقت ممكن لمثيل احادي
static Singleton _instance;
- static Singleton get instance => _instance ?? Singleton._;
- Singleton._ => _instance = this;
- }
- تنفيذ لغة بي اتش بي
- class Singleton {
- private static $instance = null;
- private function __construct{}
- public static function getInstance: self
- {
- if (null === self::$instance) {
- self::$instance = new self;
- }
- return self::$instance;
- }
- }
public final class Singleton {
- private static final Singleton INSTANCE = new Singleton;
- private Singleton {}
- public static Singleton getInstance {
- return INSTANCE;
- }
- }
public sealed class Singleton {
- private static readonly Singleton INSTANCE = new Singleton;
- private Singleton {}
- public static Singleton Instance {
- get {
- return INSTANCE;
- }
object Coin{
- // wrong example.
- private var coin: Int = 0
- fun getCoin:Int{
- return coin
- }
- fun addCoin{
- coin += 10
- }
- fun deductCoin{
- coin--
- }
- }
تنفيذ كوتلن
من جهة ثانية، الكلمة المفتاحية لكائن كوتلن object يعلن برمجياً عن صنف من النمط الاحادي.
التهيئة البطيئة
إضافةً إلى ذلك، قد ينفذ نمط الاحادي التهيئة البطيئة (بالإنجليزية: Lazy initialization)، حيث يتم إنشاء المثيل عندما يتم استدعاء الطريقة الثابتة برمجياً لأول مرة. إذا كان من الممكن استدعاء الطريقة الثابتة من خيوط متعددة بشكل متزامن، فقد يلزم اتخاذ تدابير لمنع ظروف السباق التي قد تؤدي إلى إنشاء مثيلات برمجية متعددة من الصنف. ما يلي هو تنفيذ نموذج سلامة الخيوط ، باستخدام التهيئة البطيئة مع القفل المزدوج ، المكتوب بلغة جافا.public final class Singleton {
- private static volatile Singleton instance = null;
- private Singleton {}
- public static Singleton getInstance {
- if (instance == null) {
- synchronized(Singleton.class) {
- if (instance == null) {
- instance = new Singleton;
- }
- }
- }
- return instance;
- }
- }
- تنفيذ سي شارب
📝 هل في هذه المقالة خطأ؟
إذا وجدت معلومة تحتاج تصحيحاً أو إضافة، أو أردت حذف المقالة، أرسل لنا طلباً وسنراجعه.
ما رأيك في هذه المقالة؟