Abstract Factory (Soyut Fabrika) Tasarım Deseni

Abstract Factory(Soyut Fabrika) Design Pattern, aynı sınıf ailesine ait nesnelerin oluşturulmasında kullanılır. Kullanılan alt sınıflar gizlenerek transparan olarak kullanılmalarını sağlar. Bu pattern ile client ihtiyaç duyduğu ürünlerin tiplerine göre farklı fabrikaları seçip kullanabilir. Bu fabrikalar sayesinde istemcinin ihtiyacı olan ürünler ve bu ürünlere bağlı nesneler ve fonksiyonlar istemciden bağımsız olarak abstract düzeyde gerçekleştirilerek tamamen clienttan soyutlanmış olur. Aşağıdaki örnekteki gibi bir veritabanı bağlantısı uygulaması düşünelim. Bu uygulama sayesinde MSSQL ve Oracle veritabanlarına bağlantı kurabiliyor ve client bağlanmak istediği veritabanını tipine göre seçerek sorgularını çalıştırabiliyor. Projeye buradan ulaşabilirsiniz.

namespace Connection
{
class Program
{

static void Main(string[] args)
{
ApplicationClass msSql = new ApplicationClass((new MSSQLFactory()));
msSql.Connect();
msSql.Execute();
msSql.Disconnect();
            Console.WriteLine();
            ApplicationClass oracle = new ApplicationClass((new OracleFactory()));
oracle.Connect();
oracle.Execute();
oracle.Disconnect();

            Console.ReadLine();
}
}
    public interface IConnection
{
void Connect();
void Disconnet();
}
    public class MSSQLConnection : IConnection
{
public void Connect()
{
Console.WriteLine("MSSQL Bağlantısı kuruldu");
}
        public void Disconnet()
{
Console.WriteLine("MSSQL Bağlantısı kapatıldı");
}
}
    public class OracleConnection : IConnection
{
public void Connect()
{
Console.WriteLine("Oracle bağlantısı kuruldu");
}
        public void Disconnet()
{
Console.WriteLine("Oracle bağlantısı kapatıldı");
}
}
    public interface ICommand
{
void Execute();
}
    public class MSSQLCommand : ICommand
{
public void Execute()
{
Console.WriteLine("MSSQL sorgusu çalıştırılıyor....");
}
}
    public class OracleCommand : ICommand
{
public void Execute()
{
Console.WriteLine("Oracle sorgusu çalıştırılıyor....");
}
}
    public abstract class DatabaseFactory
{
public abstract IConnection CreateConnection();
public abstract ICommand CreateCommand();
}
    public class MSSQLFactory : DatabaseFactory
{
public override ICommand CreateCommand()
{
return (new MSSQLCommand());
}
        public override IConnection CreateConnection()
{
return (new MSSQLConnection());
}
}
    public class OracleFactory : DatabaseFactory
{
public override ICommand CreateCommand()
{
return (new OracleCommand());
}
        public override IConnection CreateConnection()
{
return (new OracleConnection());
}
}
    public class ApplicationClass
{
private DatabaseFactory _databaseFactory;
private IConnection _connection;
private ICommand _command;
        public ApplicationClass(DatabaseFactory databaseFactory)
{
_databaseFactory = databaseFactory;
_connection = databaseFactory.CreateConnection();
_command = databaseFactory.CreateCommand();
}
        public void Connect()
{
_connection.Connect();
}
        public void Disconnect()
{
_connection.Disconnet();
}
        public void Execute()
{
_command.Execute();
}
}
}