C# Abstract Factory Pattern Kullanımı - OOP Design Patterns

Bu pattern'in amacı client'ın ihtiyacı olan ve aralarında ilişkiler bulunan nesnelerin üretiminden sorumlu olan soyut fabrika sınıfları yaratmaktır. Kısacası: Birbiri ile ilişkili veya bağımlı objeleri onların concrete classlarını oluşturmadan create edilmesini sağlar.



Bu pattenle ne zaman kullanılmalı:

- Client hangi hangi altsınıfların kullanması gerektiğini bilmiyorsa
- Bu alt sınıfların nasıl yaratılacağını bilmiyorsa ya da bu görevi alt sınıflara delege etmek istiyorsa


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.



Örneğin bir veritabanı bağlantı projesi düşünelim. Bu proje sayesinde MSSQL ve Oracle'a bağlantı kuruluyor ve client bağlanmak istediği veritabanı tipine göre sorgularını çalıştırabiliyor. Burada oluşturacağımız Connection ve Command nesneleri birbiri ile ilişkili nesneler. Bu patternimizle ilgili örnek bir class diagramını yazalım:

Şimdi diyagramını çizdiğimiz programımızı yazalım:

Connection için interface ve nesne tasarımları:

    public interface IConnection
    {
        void Connect();

        void Disconnect();
    }

    public class MSSQLConnection: IConnection
    {
        public void Connect()
        {
            Console.WriteLine("MSSQL baglantisi kuruldu.");
        }

        public void Disconnect()
        {
            Console.WriteLine("MSSQL baglantisi sonlandırıldı.");
        }
    }
    public class OracleConnection: IConnection
    {
        public void Connect()
        {
            Console.WriteLine("Oracle baglantisi kuruldu.");
        }

        public void Disconnect()
        {
            Console.WriteLine("Oracle baglantisi sonlandırıldı.");
        }
    }


Command için interface ve nesne tasarımları:

    public interface ICommand
    {
        void Execute();
    }
    public class MSSQLCommand: ICommand
    {
        public void Execute()
        {
            Console.WriteLine("MSSQL sorgusu calistiriliyor.");
        }
    }
    public class OracleCommand: ICommand
    {
        public void Execute()
        {
            Console.WriteLine("Oracle sorgusu calistiriliyor.");
        }
    }

Factory için abstract ve nesne tasarımları:


    public abstract class DatabaseFactory
    {
        public abstract IConnection CreateConnection();
        public abstract ICommand CreateCommand();
    }
    public class MSSQLFactory: DatabaseFactory
    {
        public override IConnection CreateConnection()
        {
            return (new MSSQLConnection());
        }

        public override ICommand CreateCommand()
        {
            return (new MSSQLCommand());
        }
    }
    public class OracleFactory: DatabaseFactory
    {
        public override IConnection CreateConnection()
        {
            return (new OracleConnection());
        }

        public override ICommand CreateCommand()
        {
            return (new OracleCommand());
        }
    }

Application class tasarımı:

    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 tarafından çağırma:

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();

        }

Çıktı:


0 yorum :

Yorum Gönder