Factory Method Pattern

Factory Method tasarım kalıbı , kalıtımsal ilişkileri olan asıl nesnelerin üretilmesi amacıyla kullanılan patternlerden birisidir. Burada asıl olan bir metottur. Bu metodun üstlendiği iş ise istemcinin ihtiyacı olan asıl ürünlerin üretilmesini sağlamak.


fabrika metodunun özelliği istemciden gelen talebe göre uygun olan ürünün üretilip istemciye verilmesi. Tek bir sınıf ve metodun bunu üstlenebilmesi için polimorfik özelliği olan bir tipe ihtiyacımız vardır. Bu yüzden productların interface olarak bir atası tasarlanır. Yani bizim creatorClassımız bir productu yani IProduct’ın taşıyabilceği türden bir referansı geriye döndürecektir.

Aşağıdaki örnekte Screen parent sınıfından 3 adet alt sınıf üretilmiştir ve bu alt sınıfların üretiminden sorumlu bir creator class tanımlanmıştır.

 public abstract class Screen { //Abstract parent class

       public abstract void Draw();
  }
//Concrete Product
  class WinScreen : Screen
  {
       public override void Draw()
      {
         Console.WriteLine("Windows Ekranı");
      }
  }
//Concrete Product
  class WebScreen : Screen
  {
      public override void Draw()
     {
        Console.WriteLine("Web Ekranı");
     }

}
//Concrete Product
  class MobileScreen : Screen
  {
      public override void Draw()
     { 
       Console.WriteLine("Mobile Ekranı");
     }
  }

  enum ScreenModel
  {
    Windows,
    Web,
    Mobile
  }
//Creator Class
  class Creator
  {

     public Screen ScreenFactory(ScreenModel screenModel)
     {
          Screen screen = null;

       switch (screenModel)
       {
            case ScreenModel.Windows:
                screen = new WinScreen();
             break;

           case ScreenModel.Web:
               screen = new WebScreen();
          break;

           case ScreenModel.Mobile:
               screen = new MobileScreen();
            break;

         }

          return screen;
      }

}
  class Program
  {

      static void Main(string[] args)
       {
           Creator creator = new Creator();

            Screen screenWindows = creator.ScreenFactory(ScreenModel.Windows);
            Screen screenWeb = creator.ScreenFactory(ScreenModel.Web);
            Screen screenMobile = creator.ScreenFactory(ScreenModel.Mobile);

            screenWindows.Draw();
            screenWeb.Draw();
            screenMobile.Draw();

           Console.ReadKey();
        }

}