شارك المقالة
شرح Singleton Design Pattern بالتفصيل مع مثال عملي والمميزات والعيوب

شرح Singleton Design Pattern بالتفصيل مع مثال توضيحي ومعرفة العيوب والمميزات

شرح Singleton Design Pattern بالتفصيل مع مثال توضيحي ومعرفة العيوب والمميزات


نمط Singleton هو واحد من أشهر أنماط التصميم في البرمجة الموجهة للكائنات (OOP)، ويُصنف ضمن الأنماط الإنشائية (Creational Patterns). يهدف هذا النمط إلى ضمان وجود مثيل (Instance) واحد فقط من كائن معين طوال دورة حياة التطبيق، مع توفير نقطة وصول عامة وآمنة لهذا المثيل.
تشرح هذه المقالة نمط Singleton Design Pattern بالتفصيل، مع مثال عملي باستخدام لغة Java، ومقارنة واضحة بين استخدام النمط وعدم استخدامه، بالإضافة إلى توضيح المميزات والعيوب، ومتى يكون استخدامه هو الخيار الأفضل.

ما هو نمط Singleton؟

نمط Singleton هو نمط تصميم يضمن إنشاء نسخة واحدة فقط من كائن معين داخل التطبيق، ويمنع إنشاء أكثر من نسخة منه. يتم الوصول إلى هذا الكائن من خلال دالة عامة (Global Access Point)، بينما يكون المُنشئ (Constructor) خاصًا لمنع الإنشاء المباشر من خارج الكلاس.
يُستخدم هذا النمط غالبًا عند الحاجة إلى إدارة موارد مشتركة مثل: – إعدادات التطبيق (Configuration) – الاتصال بقاعدة البيانات – التخزين المؤقت (Cache) – تسجيل الأحداث (Logging)

سيناريو عملي لتوضيح Singleton Pattern

لنفترض أنك تقوم ببناء نظام إدارة مشتريات لمتجر إلكتروني، وتريد التأكد من أن كل المستخدمين داخل التطبيق يتعاملون مع **عربة تسوق واحدة فقط**، بحيث تكون البيانات مشتركة ولا يتم إنشاء عربة جديدة في كل مرة.

كود جافا بدون استخدام Singleton Pattern


import java.util.ArrayList;
import java.util.List;

class ShoppingCart {
    private List items;

    public ShoppingCart() {
        items = new ArrayList<>();
    }

    public void addItem(String item) {
        items.add(item);
    }

    public List getItems() {
        return items;
    }
}

public class Main {
    public static void main(String[] args) {
        ShoppingCart cart1 = new ShoppingCart();
        cart1.addItem("Laptop");

        ShoppingCart cart2 = new ShoppingCart();
        cart2.addItem("Mouse");

        System.out.println(cart1.getItems()); // [Laptop]
        System.out.println(cart2.getItems()); // [Mouse]
    }
}
مساوئ هذا النهج بدون نمط Singleton: – عدم التحكم في الموارد: يتم إنشاء أكثر من كائن لنفس الغرض. – تكرار البيانات: كل كائن يحتفظ بحالته الخاصة. – صعوبة إدارة الحالة المشتركة بين أجزاء التطبيق.

كود جافا باستخدام Singleton Design Pattern


import java.util.ArrayList;
import java.util.List;

class ShoppingCart {
    private static ShoppingCart instance;
    private List items;

    private ShoppingCart() {
        items = new ArrayList<>();
    }

    public static ShoppingCart getInstance() {
        if (instance == null) {
            instance = new ShoppingCart();
        }
        return instance;
    }

    public void addItem(String item) {
        items.add(item);
    }

    public List getItems() {
        return items;
    }
}

public class Main {
    public static void main(String[] args) {
        ShoppingCart cart1 = ShoppingCart.getInstance();
        cart1.addItem("Laptop");

        ShoppingCart cart2 = ShoppingCart.getInstance();
        cart2.addItem("Mouse");

        System.out.println(cart1.getItems()); // [Laptop, Mouse]
        System.out.println(cart2.getItems()); // [Laptop, Mouse]
    }
}

الاختلافات بين النهجين

بدون Singleton Pattern: – يتم إنشاء أكثر من كائن لنفس الغرض. – لا توجد مشاركة للحالة بين الكائنات. – استهلاك أكبر للذاكرة.
باستخدام Singleton Pattern: – يتم إنشاء كائن واحد فقط طوال عمر التطبيق. – مشاركة الحالة بين جميع أجزاء النظام. – تحكم أفضل في الموارد المشتركة.

مميزات وعيوب Singleton Design Pattern

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

العيوب. – كسر مبدأ Single Responsibility في بعض السيناريوهات. – صعوبة الاختبار (Testing) بسبب الاعتماد على حالة ثابتة. – مشاكل في البيئات متعددة الخيوط (Multi-threading) إذا لم يتم التعامل معها بشكل صحيح.
نمط Singleton Design Pattern يُعد من الأنماط المهمة جدًا عند الحاجة إلى وجود نسخة واحدة فقط من كائن معين داخل التطبيق. يساعد هذا النمط في تنظيم الكود والتحكم في الموارد المشتركة بشكل فعال، خاصة في المشاريع المتوسطة والكبيرة.
رغم بساطته، يجب استخدامه بحذر وفي المكان المناسب، لأن الإفراط في استخدامه قد يؤدي إلى تعقيد الكود وصعوبة اختباره.
مثال تشبيهي بسيط: تخيل أن لديك مديرًا واحدًا فقط للنظام داخل شركة، لا يمكن إنشاء أكثر من مدير في نفس الوقت. جميع القرارات تمر من خلاله، وهو المسؤول الوحيد عن إدارة النظام. هذا بالضبط ما يقوم به Singleton داخل التطبيق الخاص بك.

الخلاصة: يُستخدم Singleton Design Pattern عندما نحتاج إلى إنشاء instance واحد فقط من كائن يعمل على مستوى التطبيق بالكامل، دون الحاجة إلى إنشاء كائن جديد في كل مرة يتم فيها استخدامه، مع ضمان سهولة الوصول والتحكم في الموارد.
يمكنك التعرف علي مثال واقعي حول استخدام Singleton Design Pattern في تطبيق عملي
شاهد أيضًا
مقالات ذات صلة
شرح Liskov substitution في مبادئ ال Solid لكتابة كود منظم

شرح Liskov substitution في مبادئ ال Solid لكتابة كود منظم بسم الله الرحمن الرحيم في…

كود برنامج بلغة جافا لطباعة اول واخر حرف من الكلمة – The beginning and end of the word is Java code

اكتب برنامج بواسطة برمجة جافا يقوم بمعرفة اول واخر حرف من الكلمات . اصبحت لغة…

شرح كيفية عمل stretch للتصميم والتعامل معه مثل تطبيق snapchat

شرح كيفية عمل stretch للتصميم والتعامل معه مثل تطبيق snapchatسوف نقوم في هذه المقالة سوف…

🚫 مانع الإعلانات مفعل

يجب إيقاف مانع الإعلانات لاستكمال تصفح الموقع