وبلاگ شخصی حامد شیربندی

حامد شیربندی

توسعه دهنده نرم افزار

پیاده سازی الگوی Singleton

الگوی Singleton یکی از الگوهای پر استفاده در طراحی نرم افزار می باشد که یک الگوی یونیک بوده و هیچ جایگزینی ندارد.از این الگو زمانی استفاده میکنیم که در سطح برنامه یک کلاس که نمونه سازی آن برایمان هزینه بر است را میخواهیم استفاده کنیم. Singleton به ما کمک میکند که به ازای تمام دسترسی ها در سطح برنامه به آن کلاس فقط و فقط یک نمونه از آن ایجاد شده باشد و همه ی درخواست ها از یک نمونه ی زنده از آن استفاده کنند. با این کار بجای اینکه آن کلاس 100 بار به ازای 100 در خواست نمونه سازی شود، فقط یکبار نمونه سازی شده و به صورت static در اختیار سایر درخواست ها قرار میگیرد.

پیاده سازی یک مثال :

همانطور که مشخص است باید یک پراپرتی استاتیک از آن کلاس داشته باشیم که یکبار نمونه سازی شود. اما در برنامه های چندنخی بویژه در برنامه های وب نیاز است تا مدیریت لازم برای Thread Safe بودن آن هم انجام شود تا بیش از یک Thread موفق به ایجاد نمونه از آن نشود.

برای حل این مشکل راههای مختلفی مثل استفاده از Lock می تواند مورد استفاده قرار گیر اما با اضافه شدن کلاس Lazy در دات نت 4 این موضوع به صورت توکار در دات نت حل شده و علاوه بر مدیریت Thread ها این امکان اضافه شده که فقط در زمان نیاز، کلاس مربوطه نمونه سازی شود که خود این مبحث را میتوانید در پیاده سازی الگوی Lazy Initialization پیگیری کنید.

در کد های زیر یک نمونه Singleton برای به اشتراک گذاری کلاس ApplicationUser در سطح برنامه پیاده سازی شده است :



public sealed class ApplicationUser
{
  private readonly IUserService _userService;
  private static readonly Lazy _current = new Lazy(() => new ApplicationUser(),    LazyThreadSafetyMode.ExecutionAndPublication);


  public static ApplicationUser Current
  {
     get
      {
         return _current.Value;
      }
   }


  private ApplicationUser()
  {
     _userService = new UserService();
  }



 public UserInfo GetUserInfo()
 {
      var userInfo = new UserInfo();
      if (HttpContext.Current.Request.IsAuthenticated)
       {
           var currentUserId = User.Identity.GetUserId();

          //get user from database
          userInfo = _userService.GetById(currentUserId);
      }
 return userInfo;
  }

حالا نحوه ی استفاده از این کلاس در سطح برنامه و حتی در View های یک پروژه ی MVC به شکل زیر خواهد بود:



 Var currentUser=ApplicationUser.Current.GetUserInfo();

نوشته شده توسط حامد شیربندی

اگر در مورد این نوشته سوال یا ابهامی وجود دارد میتوانید به ایمیل من ارسال کنید. البته در این مورد باید کمی صبور باشید. در آینده بخش نظرات اضافه خواهد شد.