4.09.2017

C# Abstract Factory Pattern Kullanimi - OOP Design Patterns

 

Bu pattern'in amaci client'in ihtiyaci olan ve aralarinda iliskiler bulunan nesnelerin üretiminden sorumlu olan soyut fabrika siniflari yaratmaktir. Kisacasi: Birbiri ile iliskili veya bagimli objeleri onlarin concrete classlarini olusturmadan create edilmesini saglar.

Bu pattenle ne zaman kullanilmali:

- Client hangi hangi altsiniflarin kullanmasi gerektigini bilmiyorsa
- Bu alt siniflarin nasil yaratilacagini bilmiyorsa ya da bu görevi alt siniflara delege etmek istiyorsa


Bu pattern ile client ihtiyaç duydugu ürünlerin tiplerine göre farkli fabrikalari seçip kullanabilir. Bu fabrikalar sayesinde istemcinin ihtiyaci olan ürünler ve bu ürünlere bagli nesneler ve fonksiyonlar istemciden bagimsiz olarak abstract düzeyde gerçeklestirilerek tamamen clienttan soyutlanmis olur.



Örnegin bir veritabani baglanti projesi düsünelim. Bu proje sayesinde MSSQL ve Oracle'a baglanti kuruluyor ve client baglanmak istedigi veritabani tipine göre sorgularini çalistirabiliyor. Burada olusturacagimiz Connection ve Command nesneleri birbiri ile iliskili nesneler. Bu patternimizle ilgili örnek bir class diagramini yazalim:
 

Simdi diyagramini çizdigimiz programimizi yazalim:

Connection için interface ve nesne tasarimlari:
 

    public interface IConnection
    {
        void Connect();
 
        void Disconnect();
    }
 
    public class MSSQLConnectionIConnection
    {
        public void Connect()
        {
            Console.WriteLine("MSSQL baglantisi kuruldu.");
        }
 
        public void Disconnect()
        {
            Console.WriteLine("MSSQL baglantisi sonlandirildi.");
        }
    }
    public class OracleConnectionIConnection
    {
        public void Connect()
        {
            Console.WriteLine("Oracle baglantisi kuruldu.");
        }
 
        public void Disconnect()
        {
            Console.WriteLine("Oracle baglantisi sonlandirildi.");
        }
    }
 
 
Command için interface ve nesne tasarimlari:
 
    public interface ICommand
    {
        void Execute();
    }
    public class MSSQLCommandICommand
    {
        public void Execute()
        {
            Console.WriteLine("MSSQL sorgusu calistiriliyor.");
        }
    }
    public class OracleCommandICommand
    {
        public void Execute()
        {
            Console.WriteLine("Oracle sorgusu calistiriliyor.");
        }
    }
 
Factory için abstract ve nesne tasarimlari:
 
 
    public abstract class DatabaseFactory
    {
        public abstract IConnection CreateConnection();
        public abstract ICommand CreateCommand();
    }
    public class MSSQLFactoryDatabaseFactory
    {
        public override IConnection CreateConnection()
        {
            return (new MSSQLConnection());
        }
 
        public override ICommand CreateCommand()
        {
            return (new MSSQLCommand());
        }
    }
    public class OracleFactoryDatabaseFactory
    {
        public override IConnection CreateConnection()
        {
            return (new OracleConnection());
        }
 
        public override ICommand CreateCommand()
        {
            return (new OracleCommand());
        }
    }
 
Application class tasarimi:
 
    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.Disconnect();
        }
 
        public void Execute()
        {
            _command.Execute();
        }
    }
 
Client tarafindan çagirma:
 
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();
 
        }
 
Çikti: