Factory Method Design Pattern
Factory Method tasarım kalıbı , kalıtımsal ilişkileri olan 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 verilmesidir. Tek bir sınıf ve metodun bunu üstlenebilmesi için polimorfik özelliği olan bir tipe ihtiyacımız var. Yani bir parent class ve bu parent classtan türeyen subclasslar. 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 sub class oluşturulmuştur ve bu alt sınıfların üretiminden sorumlu bir creator class (factory) 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(); } }