الگوهای طراحی راه حل های اثبات شده ای برای مشکلات طراحی نرمافزار هستند. آنها به بهبود کیفیت کد، ارتقای قابلیت استفاده مجدد و افزایش قابلیت نگهداری کمک می کنند. ما از آنها برای صرفهجویی در زمان و تولید کد های با کیفیت، توسعهپذیر و انعطافپذیر استفاده میکنیم. در این مطلب قصد داریم الگوی طراحی Singleton را معرفی کنیم.
الگوی Singleton یک الگوی طراحی ایجاد کننده(Creational) است که تضمین می کند یک کلاس فقط یک نمونه دارد و فقط یک نقطه دسترسی به آن نمونه را فراهم می کند.
الگوی Singleton شامل عناصر زیر است:
الگوی Singleton تضمین میکند که فقط یک نمونه از کلاس Singleton میتواند ایجاد شود و فقط یک راه برای دسترسی به آن وجود دارد. فایده این الگو زمانی مشخص میشود که بخواهیم در بخش های مختلف برنامه از یک نمونه یکسان استفاده کنیم.
تفاوت اصلی بین کلاس های 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 را اجرا کند. درنتیجه، در نخ اول نمونه مقدار دهی میشود و در نخ های بعدی وارد شرط نخواهیم شد.
برای مطالعه سایر الگو های طراحی، میتوانید از لیست زیر استفاده کنید. همچنین یک مخزن کد در گیت هاب که شامل همهی الگو های طراحی میشود، برای شما قرار گرفته است.
من محمدرضا باباخانی هستم، توسعه دهنده نرم افزار. در اینجا تجربیات، نظرات و پیشنهادات خودم رو درباره تکنولوژی مینویسم. امیدوارم مطالبی که مینویسم بدردتون بخوره.
ثبت دیدگاه