Factory Pattern

Barış Özaydın
Bir Geliştiricinin Maceraları
2 min readMar 7, 2012

En bilindik tasarım kalıplarından birisidir factory pattern. Bu model ile üzerinde iş yapmak istediğiniz sınıf ile ilgili bilgiyi (sınıfın tam ismi, bir kod vs olabilir) verip size o sınıfın bir örneğini yaratıp ilgili sınıf ile çalışmanızı sağlar. Bu kalıp sayesinde nesne oluşturma sorumluluğunu sistemden soyutlamış oluruz, böylelikle runtime’da oluşturulan nesne değişiklik gösterebilir.

Bir örnekle anlatmak gerekirse;

Basit bir kayıt programı yaptınız, girmiş olduğunuz verileri veritabanına kaydediyor. Ama bazı müşterilerinizde mssql var bazı müşterilerinizde mysql bazılarında ise oracle… bu durumda ne yapacağız? programın her veritabanı için farklı bir versiyonunu çıkarmak biraz zahmetli olur, tüm müşterilerimize mssql aldırmak ya da mysql kurdurmak da zahmetli olacaktır. Peki ne yapmalıyız?

işte burada factory pattern devreye giriyor. Biz sistemimizi tüm veritabanları ile çalışabilir şekilde tasarlayalım, kullanıcı ufak bir config ayarı ile bunu değiştirebilsin. Güzel olmaz mı? kulağa hoş geliyor.

Bunun için veritabanı işlemlerinde system.Data.Sql… değil kendi soyut sınıflarımızı kullanarak devam etmeliyiz ki sistem hangi veritabanına bağlanılıyor bundan soyutlanabilsin.

Yaptığım örnekte Mysql ve Sql adlı iki sınıfım var ve bu iki sınıfın da türediği bir dbManager adlı abstract sınıfım var. ve bize bir dbManager türünden bir nesne oluşturan dbFactory sınıfı var. Örnek basit olarak config dosyasında yazılan sınıfın bir örneğini oluşturuyor ve baglan methodunu çağırıyor ve ekrana hangi veritabanı ile çalıştığımızı gösteren bir messageBox çıkıyor. Aynı yöntemle işe yarar methodlar yaparak sisteminizi gerçekten veritabanı bağımsız hale getirebilirsiniz.

Örnek:

//Abstract dbManager sınıfım, içinde baglan adlı bir method var sadece

public abstract class dbManager

{

public abstract string baglan();

}

//dbManager’dan türemiş bir alt sınıf, baglan methodunu implemente etmiş.

public class Sql: dbManager

{

public override string baglan()

{

return “sql”;

}

}

//dbManager’dan türemiş bir alt sınıf, baglan methodunu implemente etmiş.

public class MySql: dbManager

{

public override string baglan()

{

return “MySql”;

}

}

//Config dosyasındaki türe göre nesneyi oluşturup geri döndüren sınıfımız.

public static class dbFactory

{

public static dbManager GetDbManager()

{

Object newObj = Activator.CreateInstance(Type.GetType(Properties.Settings.Default.Veritabani));

return (dbManager)newObj;

}

}

Evet yukarıdaki gibi basit anlamda bir alt yapı kurduk, bunu da şu şekilde kullanacağız;

dbManager manager = dbFactory.GetDbManager();

string Veritabani = manager.baglan();

MessageBox.Show(Veritabani);

Örnek proje dosyasını indirmek için tıklayın

--

--