آشنايی با الگوهای طراحی (Design Patterns)
  نگاه کلی به تعاريف الگوهای طراحی
   C#
   ۴۳۹۱۸
   این مقاله حاوی فایل ضمیمه نمی باشد
   رکسانا زاهدی
   ۱۳۸۶/۱۰/۲۲
ارسال لینک صفحه برای دوستان ارسال لینک صفحه برای دوستان  اضافه کردن به علاقه مندیها اضافه کردن به علاقه مندیها   نسخه قابل چاپ نسخه قابل چاپ

 

يکي از مهمترين دلايل محققين علوم رايانه براي ايجاد الگوهاي طراحي يا Design Patterns، برآورده کردن نياز به کدهاي زيبا، ساده و قابل استفاده مجدد مي باشد. به طور خلاصه مي توان گفت:
• الگوهاي طراحي راهکارهايي هستند که مي توانند براي حل مشکلات کدنويسي شما بارها مورد استفاده قرار گيرند
• الگوهاي طراحي مشخص کننده مفاهيم انتزاعي هستند که در سطحي بالاتر از کلاسها، نمونه ها (instances)  و يا کمپوننتها قرار مي گيرند.
اما مي توان گفت که الگوهاي طراحي تنها براي بيان چگونگي طراحي اشياء بيان نمي شوند، بلکه ارتباط و تعامل بين اشيا را نيز شرح مي دهند و حتي بيانگر راههايي براي چگونگي ارث بري و شرايط و محدوديت هاي آنها نيز هستند.
در حقيقت الگوهاي طراحي نوشته نمي شوند، بلکه کشف مي گردند و الگوهاي متداولي که امروزه به  وفور در مقالات و کتابها از آنها ياد مي شود، الگوهايي هستند که در برنامه هاي متعدد و شناخته شده بارها مورد استفاده قرار گرفته اند و مي توانند بسياري از ديگر برنامه ها را نيز تحت پوشش خود قرار دهند.
به طور کلي الگوهاي طراحي به سه دسته تقسيم مي شوند:
1- الگوهاي آفرينشي (Creational patterns):
اين الگوها، نمونه هاي اشياء را براي شما ايجاد مي کنند، بدون اينکه شما را در آن عمل دخيل نمايند.
2- الگوهاي ساختاري (Structural patterns):
به شما کمک مي کنند که گروههاي اشياء را در ساختارهاي بزرگتر پياده سازي کنيد يا به عبارت ديگر کلاسها و اشيا را با هم ترکيب کنيد.
3- الگوهاي رفتاري (Behavioral patterns):
به شما کمک مي کنندکه ارتباط بين اشياء را در سيستم خود تعريف کنيد و يا چگونگي تعامل بين کلاسها و نحوه توزيع مسئوليت بين آنها را مورد بحث قرار دهيد.


الگوهاي آفرينشي:


1- Abstract Factory: رابط (اينترفيسي) ايجاد مي کند که يک مجموعه از اشياء مرتبط را ساخته و برمي گرداند.
2- Builder: ساخته شدن يک شي ء پيچيده را از نمايش آن جدا مي کند. بنابراين بسته به  نيازهاي برنامه چندين نمايش متفاوت از شي ء مي تواند ايجاد گردد.
3- Prototype: با ايجاد يک کلاس نمونه شروع شده و براي ساختن ساير نمونه هاي جديد، شبيه سازي يا کلون (Clone) انجام مي شود. اين نمونه ها بعدا مي توانند توسط متدهاي عمومي خود بهم متصل شوند.
4- Singleton: کلاسي است که نمي تواند بيش از يک نمونه شي ء داشته باشد. به اين ترتيب تنها يک نقطه دسترسي عمومي از نمونه شي ء ايجاد مي گردد.
در اين مقاله به منظور آشنايي مقدماتي با الگوي Abstract Factory با يک الگوي مقدماتي اما متداول به نام Factory Method آشنا مي شويم. در اين الگو هيچ کلاسي به تنهايي تصميم نمي گيرد که چه زير کلاسي از آن نمونه گيري شود. بلکه تصميم گيري را به کلاسهاي پايين تر واگذار مي نمايد.
در اين الگو در واقع يک نقطه تصميم گيري براي نمونه گيري از کلاسها وجود ندارد و به جاي آن، برنامه هاي نوشته شده در اين الگو، يک کلاس انتزاعي (Abstract) تعريف مي کنند که اشيا را خلق مي کند اما به زير کلاسها اجازه مي دهد تا تصميم بگيرند کداميک از اشيا ايجاد شوند. در واقع اين مسئله با تعريف يک متد جداگانه براي ايجاد اشيا حل مي گردد که زيرکلاسها مي توانند آنرا Override  کنند و به اين وسيله نوع محصول مشتق شده  را که ايجاد خواهد شد، مشخص نمايند.
شکل زير نماينده کلاس دياگرام UML از اين الگو مي باشد:

کلاسها و يا اشيايي که در ابن دياگرام وجود دارند عبارتند از:
1- Product: (به عنوان مثال صفحه ) يک اينترفيس يا رابط از اشبايي که Factory method ايجاد مي کند، تعريف مي نمايد.
2- ConcreteProduct: (به عنوان مثال صفحه مهارتها، صفحه آموزش و ...) شامل پياده سازي اينترفيس Product مي باشد.
3- Creator: (به عنوان مثال سند) معرف FactoryMethod است که يک شي ء از نوع Product را برمي گرداند.همچنين Creator  مي تواند يک پياده سازي از FactoryMethod را تعريف کند که يک شي ء از نوع ConcreteProduct  را برمي گرداند.  همچنين ممکن است FactoryMethod  را براي ايجادد شي ء از نوع Product صدا بزند.
4- ConcreteCreator: با  بازنويسي (Override) متد Factory يک نمونه از ConcreteProduct را برمي گرداند.

نمونه کد ساده  اي براي روشن شدن اين مفاهيم آوره شده است:


// Factory Method pattern -- Structural example
using System;
using System.Collections;
namespace DoFactory.GangOfFour.Factory.Structural
{
  // MainApp test application
  class MainApp
  {
    static void Main()
    {
      // An array of creators
      Creator[] creators = new Creator[2];
      creators[0] = new ConcreteCreatorA();
      creators[1] = new ConcreteCreatorB();
      // Iterate over creators and create products
      foreach(Creator creator in creators)
      {
        Product product = creator.FactoryMethod();
        Console.WriteLine("Created {0}",
          product.GetType().Name);
      }
      // Wait for user
      Console.Read();
    }
  }
  // "Product"
  abstract class Product
  {
  }
  // "ConcreteProductA"
  class ConcreteProductA : Product
  {
  }
  // "ConcreteProductB"
  class ConcreteProductB : Product
  {
  }
  // "Creator"
  abstract class Creator
  {
    public abstract Product FactoryMethod();
  }
  // "ConcreteCreator"
  class ConcreteCreatorA : Creator
  {
    public override Product FactoryMethod()
    {
      return new ConcreteProductA();
    }
  }
  // "ConcreteCreator"
  class ConcreteCreatorB : Creator
  {
    public override Product FactoryMethod()
    {
      return new ConcreteProductB();
    }
  }
}
//خروجي
Created ConcreteProductA
Created ConcreteProductB