Bu desen Factory Method desenine çok benzer. Amaç yine aynıdır. Sistemden nesnelerin oluşma işini soyutlar. Abstract Factory benzer özellikleri olan nesne fabrikalarını gruplar. İçinde birden fazla fabrika vardır.
Örneğimizde birden fazla türde database'de kaydetme ve sorgulama işlemlerini gruplamak için soyut fabrikayı kullanıyoruz :
Kısaca kodlarına da bakalım :
Önce ürünlerimizin gerçek ve soyut sınıflarını yazıyoruz.
Kaydetme.cs
SQLBaglanti.cs
AccessBaglanti.cs
Komut.cs
SQLSorgu.cs
AccessSorgu.cs
BaglantiFabrikası.cs
SQLFabrikası.cs
AccessFabrikası.cs
Fabrika.cs
ve kullanmak istediğimiz yer :
BaglantiFabrikası fab = new Fabrika().fabrikaAl("mssql");
Komut cmd = fab.sorgulamaİşiYap();
Kaydetme cn = fab.kaydetmeİşiYap();
cmd.sorgula("");
cn.kaydet("");
(NOT: UML, Tasarım Desenleri sitesinden alınıp düzenlenmiştir.)
Örneğimizde birden fazla türde database'de kaydetme ve sorgulama işlemlerini gruplamak için soyut fabrikayı kullanıyoruz :

Kısaca kodlarına da bakalım :
Önce ürünlerimizin gerçek ve soyut sınıflarını yazıyoruz.
Kaydetme.cs
interface Kaydetme
{
void kaydet(string cumle);
}
{
void kaydet(string cumle);
}
SQLBaglanti.cs
class SQLBaglanti:Kaydetme
{
}
{
public void kaydet(string cumle)
{
MessageBox.Show("sql'e kaydedildi");
}
{
MessageBox.Show("sql'e kaydedildi");
}
}
AccessBaglanti.cs
class AccessBaglanti:Kaydetme
{
}
{
public void kaydet(string cumle)
{
MessageBox.Show("access'e kaydedildi");
}
{
MessageBox.Show("access'e kaydedildi");
}
}
Komut.cs
interface Komut
{
void sorgula(string query);
}
{
void sorgula(string query);
}
SQLSorgu.cs
class SQLSorgu:Komut
{
}
{
public void sorgula(string query)
{
MessageBox.Show("sql'de sorgu oluştu");
}
{
MessageBox.Show("sql'de sorgu oluştu");
}
}
AccessSorgu.cs
class AccessSorgu:Komut
{
}
{
public void sorgula(string query)
{
MessageBox.Show("access'de sorgu oluştu");
}
{
MessageBox.Show("access'de sorgu oluştu");
}
}
BaglantiFabrikası.cs
interface BaglantiFabrikası
{
Kaydetme kaydetmeİşiYap();
Komut sorgulamaİşiYap();
}
{
Kaydetme kaydetmeİşiYap();
Komut sorgulamaİşiYap();
}
SQLFabrikası.cs
class SQLFabrikası : BaglantiFabrikası
{
}
{
public Kaydetme kaydetmeİşiYap()
{
return new SQLBaglanti();
}
{
return new SQLBaglanti();
}
public Komut sorgulamaİşiYap()
{
return new SQLSorgu();
}
{
return new SQLSorgu();
}
}
AccessFabrikası.cs
class AccessFabrikası:BaglantiFabrikası
{
}
{
public Kaydetme kaydetmeİşiYap()
{
return new AccessBaglanti();
}
{
return new AccessBaglanti();
}
public Komut sorgulamaİşiYap()
{
return new AccessSorgu();
}
{
return new AccessSorgu();
}
}
Fabrika.cs
class Fabrika
{
}
{
public BaglantiFabrikası fabrikaAl(string tip)
{
}
{
if (tip == "mssql")
{
return new SQLFabrikası();
}
else if (tip == "access")
{
return new AccessFabrikası();
}
return new SQLFabrikası();//if'lere girmez ise bu olacak
{
return new SQLFabrikası();
}
else if (tip == "access")
{
return new AccessFabrikası();
}
return new SQLFabrikası();//if'lere girmez ise bu olacak
}
}
ve kullanmak istediğimiz yer :
BaglantiFabrikası fab = new Fabrika().fabrikaAl("mssql");
Komut cmd = fab.sorgulamaİşiYap();
Kaydetme cn = fab.kaydetmeİşiYap();
cmd.sorgula("");
cn.kaydet("");
(NOT: UML, Tasarım Desenleri sitesinden alınıp düzenlenmiştir.)
Yorumlar