تخطَّ إلى المحتوى

Singleton

نمط الكائن الوحيد Singleton

Singleton يضمن أن كلاس معيّن لا يملك سوى نسخة واحدة فقط طوال عمر البرنامج، ويوفّر نقطة وصول عامة لها.

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

مفيد لموارد مشتركة يجب أن تكون واحدة فعلاً: اتصال قاعدة بيانات، إعدادات التطبيق، أو Logger مركزي. لكنه من أكثر الأنماط إساءة استخدامًا — كثيرون يستخدمونه كبديل مقنّع لمتغيرات عامة (Global Variables)، ما يصعّب الاختبار ويُخفي التبعيات الحقيقية بين أجزاء الكود.

الصياغة

class Singleton {
  static #instance;
  static getInstance() { ... }
}

📄 مثال

class Logger {
  static #instance;
  #logs = [];

  static getInstance() {
    if (!Logger.#instance) {
      Logger.#instance = new Logger();
    }
    return Logger.#instance;
  }

  log(message) {
    this.#logs.push(message);
  }
}

const a = Logger.getInstance();
const b = Logger.getInstance();
console.log(a === b); // true — نفس النسخة بالضبط

أهم النقاط

النقطةالوظيفة
التصنيفنمط إنشائي (Creational)
يحل مشكلةضمان نسخة واحدة فقط من كائن مشترك (اتصال DB، إعدادات، Logger)
التحذير الأشهريصعّب اختبار الوحدات (Unit Testing) ويُخفي تبعيات حقيقية إذا أُسيء استخدامه كبديل لمتغيرات عامة

💡 نصائح عملية

  • في تطبيقات حديثة، فضّل حقن التبعية (Dependency Injection) على Singleton يدوي — تحصل على نفس ضمان النسخة الواحدة مع سهولة اختبار أكبر

⚠️ أخطاء شائعة

  • استخدامه لأي كائن 'مشترك مريح' حتى لو لم تكن هناك حاجة فعلية لنسخة واحدة فقط

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار OOP الكامل بالعربي.