معرفی الگوی طراحی Singleton

معرفی الگوی طراحی Singleton

مدت مطالعه : 4 دقیقه

04 فروردین 1402

الگوهای طراحی راه حل های اثبات شده ای برای مشکلات طراحی نرم‌افزار هستند. آنها به بهبود کیفیت کد، ارتقای قابلیت استفاده مجدد و افزایش قابلیت نگهداری کمک می کنند. ما از آنها برای صرفه‌جویی در زمان و تولید کد های با کیفیت، توسعه‌پذیر و انعطاف‌پذیر استفاده می‌کنیم. در این مطلب قصد داریم الگوی طراحی Singleton را معرفی کنیم.

الگوی Singleton یک الگوی طراحی ایجاد کننده(Creational) است که تضمین می کند یک کلاس فقط یک نمونه دارد و فقط یک نقطه دسترسی به آن نمونه را فراهم می کند.

الگوی Singleton شامل عناصر زیر است:

  • کلاس Singleton: کلاسی است که برای داشتن تنها یک نمونه طراحی شده است. به طور معمول دارای یک متد سازنده(Constractor) خصوصی(Private) و یک متد ایستا(Static) برای به دست آوردن آن نمونه است.
  • متغیر نمونه: در کلاس Singleton، یک متغیر ایستا(Static) خصوصی(Private) از نوع همان کلاس وجود دارد که تنها نمونه موجود را نگه داری می‌کند.
  • متد GetInstance: این متد، یک متد ایستا(Static) در کلاس Singleton است که به وسیله آن نمونه موجود را دریافت می‌کنیم. اگر نمونه مقدار دهی نشده باشد، قبل از بازگرداندن نمونه، آن را مقدار دهی می‌کنیم.

الگوی Singleton تضمین می‌کند که فقط یک نمونه از کلاس Singleton می‌تواند ایجاد شود و فقط یک راه برای دسترسی به آن وجود دارد. فایده این الگو زمانی مشخص می‌شود که بخواهیم در بخش های مختلف برنامه از یک نمونه یکسان استفاده کنیم.

تفاوت کلاس Singleton و کلاس Static

تفاوت اصلی بین کلاس های Singleton و Static این است که یک کلاس Singleton به شما اجازه می دهد یک نمونه از یک کلاس ایجاد کنید. در حالی که یک کلاس ایستا(Static) به شما اجازه ایجاد هیچ نمونه ای از کلاس را نمی دهد. و همه اعضا با استفاده از نام کلاس قابل دسترسی هستند.

به طور کلی، الگوی Singleton زمانی مفید است که شما نیاز به مدیریت یک منبع(Resource) مشترک، مانند اتصال پایگاه داده، داده‌های پیکربندی یا یک دستگاه سخت‌افزاری دارید، و می‌خواهید مطمئن شوید که تنها یک نمونه از کلاسی که آن منبع(Resource) را مدیریت می‌کند وجود دارد. کلاس‌های ایستا(Static) زمانی مفید هستند که مجموعه‌ای از متدهای کاربردی دارید که نیازی به حفظ وضعیت(State) ندارند و می‌توانید از هر نقطه کد بدون نیاز به ایجاد نمونه‌ای از کلاس فراخوانی شوند.

در ادامه مثالی از الگوی Singleton در سی شارپ قرار گرفته است:

public sealed class Singleton
{
    private static Singleton instance = null;
    private Singleton()
    {
        // Private constructor to prevent other instances from being created
    }
    public static Singleton GetInstance
    {
        get
        {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
    }
}

در این مثال، کلاس Singleton بصورت sealed تعریف شده است تا از وراثت جلوگیری شود و اطمینان حاصل شود که فقط می تواند یک نمونه داشته باشد. متغیر نمونه به صورت خصوصی(Private) و ایستا(Static) تعریف شده و با مقدار null مقداردهی می‌شود.

ویژگی GetInstance یک ویژگی(Property) ایستا(Static) عمومی(Public) است که دسترسی به نمونه را فراهم می کند. برای اطمینان از اینکه نمونه ایجاد شده است مقدار آن را چک می‌کند و اگر نمونه موجود قبلا ایجاد شده باشد، آن را برمی گرداند. برای بکارگیری از نمونه، فقط باید ویژگی Singleton.GetInstance را از هر کجای برنامه فراخوانی کنید. تعریف کلاس Singleton بصورت مثال قبل در برنامه هایی که از چند نخ(Thread) استفاده می‌کنند ایمن نیست.

برای آنکه بتوان در برنامه های چند نخی(MultiThreading) از الگوی Singleton استفاده کرد باید کد را بصورت زیر تغییر داد:

public sealed class Singleton
{
    private static Singleton instance = null;
    private static readonly object padlock = new object();
    private Singleton()
    {
        // Private constructor to prevent other instances from being created
    }
    public static Singleton GetInstance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
    }
}

این تغییر سبب می‌‎شود که اگر چندین نخ بخواهند بصورت همزمان به یک قسمت مشترک از حافظه دسترسی پیدا کنند، نتوانند بصورت موازی این کار را انجام دهند. بنابرین هر نخ باید به نوبت قطعه کد های داخل بلوک lock را اجرا کند. درنتیجه، در نخ اول نمونه مقدار دهی می‌شود و در نخ های بعدی وارد شرط نخواهیم شد.

برای مطالعه سایر الگو های طراحی، میتوانید از لیست زیر استفاده کنید. همچنین یک مخزن کد در گیت هاب که شامل همه‌ی الگو های طراحی می‌شود، برای شما قرار گرفته است.

design patterns

ایجاد کننده (Creational):الگوی طراحی Factory 
الگوی طراحی Builder 
الگوی طراحی Singleton 
الگوی طراحی Prototype 
الگوی طراحی Abstract Factory 
ساختاری (Structural):الگوی طراحی Adapter 
الگوی طراحی Bridge 
الگوی طراحی Composite 
الگوی طراحی Decorator 
الگوی طراحی Facade 
الگوی طراحی Flyweight 
الگوی طراحی Proxy 
رفتاری (Behavioral):الگوی طراحی Chain of Responsibility 
الگوی طراحی Command 
الگوی طراحی Interpreter 
الگوی طراحی Mediator 
الگوی طراحی Memento 
الگوی طراحی Observer 
الگوی طراحی State 
الگوی طراحی Strategy 
الگوی طراحی Template Method 
الگوی طراحی Visitor 
الگوی طراحی Iterator 
  • اشتراک گذاری:
محمدرضا باباخانی
محمدرضا باباخانی

من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که می‌نویسم بدردتون بخوره.

آخرین مطالب

سرویس مش؛ ساده سازی ارتباطات میکروسرویس و افزایش رؤیت پذیری

در چشم انداز همیشه در حال تحول توسعه نرم افزار، معماری میکروسرویس ها به دلیل مقیاس پذیری، انعطاف پذیری و توسعه پذیری محبوبیت قابل توجهی به دست آورده است. با این حال، با افزایش تعداد میکروسرویس ها در یک برنامه، مدیریت ارتباطات آنها و اطمینان از رؤیت صحیح همه آنها به طور فزاینده ای چالش برانگیز می شود. اینجاست که سرویس مش وارد عمل می شود.

اهمیت محاسبات لبه یا Edge Computing

ا توجه به سرعت تحول فناوری، یکی از مفاهیمی که توجه زیادی را به خود جلب کرده و نحوه تعامل ما با سیستم های دیجیتال را تغییر می دهد، محاسبات لبه (Edge Computing) است.

معماری رویداد محور چیست؟

معماری رویداد محور (EDA) یک الگوی طراحی نرم افزار است که در توسعه نرم افزار های مدرن به طور چشمگیری محبوب شده است. در این معماری، جریان داده ها با وقوع رویدادها تعیین می شود. بر خلاف سیستم های متمرکز سنتی که دائماً در حال بررسی وضعیت جدید هستند. معماری رویداد محور به ویژه برای سیستم هایی مفید است که به پردازش حجم زیادی از داده ها بصورت بلادرنگ(real-time) نیاز دارند.

ثبت دیدگاه