Factory tasarım deseni kurucu desenler grubundan olup kalıtımsal ilişkisi bulunan sınıfların üretimini kontrollü ve tek bir tip, hatta metot üzerinde toplayarak sınıfların yönetimli bir şekilde üretilmesini amaçlar. Birçok dokümanda ismine Factory Method tasarım deseni şeklinde de rastlayabilirsiniz. Bu şekilde isimlendirilmesinin sebebi ise can alıcı noktasının nesnelerin oluşumunu kontrol eden bir metodun bulunmasıdır. 

http://dofactory.com a göre en çok kullanılan desenlerdendir. Konu anlatımı bittiğinde çok kullanılan bir desen olduğuna siz de katılacaksınız. Çünkü birçoğumuzun yazılım geliştirme sırasında farkında olmadan kullandığı bir desendir, fakat isminin Factory Tasarım deseni olduğunu bilmiyor olabilirsiniz.

Desenin genel tanımını yaptıktan sonra olabildiğince gerçek bir yaşam senaryosu üzerinde anlatımımıza devam edelim.

Senaryomuz şu şekilde; Yazdığımız bir çok uygulamada hata ayıklama, analiz veya denetim yapabilmek için uygulamanın akışı esnasında oluşan hataları, uyarıları ve hatta bilgi mesajlarını dahi saklamamız gerekebilir. İşte bu mesajları saklama işlemine log tutma denir. Bu loglama işlemi bir text dosyasına yazarak olabilir, databasede tablolara yazarak olabilir, işletim sistemindeki olay günlüğüne yazarak olabilir vs. Biz de kendi yazdığımız bir uygulama için log tutma yapımızı kurmak istiyoruz ve şu an için bu logları databasede tutmak istiyoruz.Bunun yanı sıra kafamızda da şu ihtimal var: “uygulamanın gidişatı gereği ben bu logları text dosyasında da tutmak isteyebilirim”. Senaryomuz bu şekilde. Şimdi de bu düşüncemizi bir java uygulamasıyla hayata geçirmeye çalışalım. Tabii uygulamaya geçmeden önce senaryomuzu class diyagramı üzerinde görmekte fayda var.

Öncelikle işe şuradan başlıyorum; eğer ki ben logları farklı ortamlarda tutabileceksem LoggerType isminde bir enumeration tanımlıyorum ve içine logger tiplerimi yazıyorum.

public enum LoggerType {

    TxtFileLogger,

    DBLogger,

    EventLogger

}

Daha sonra ise madem ki benim farklı tiplerde loggerlarım olacak o zaman ben de bu loggerların ortak özelliklerini bir çatı da toplayıp Logger diye bir interface tanımlıyorum. Burada Logger objesi interface değil de abstract class ta olabilirdi. Ancak bu noktada neden interface yada neden abstract işin bu kısmına girmiyorum.

public interface Logger {

    public void LogInfo();

    public void LogWarning();

    public void LogError();

}

Daha sonra ise farklı tiplerdeki logger class larımı oluşturmaya başlıyorum.

public class TextFileLogger implements Logger {

    @Override

    public void LogInfo() {

        System.out.println("Bilgi niteliğindeki mesajlar başarıyla Text File a yazıldı");

    }

    @Override

    public void LogWarning() {

        System.out.println("Uyarı niteliğindeki mesajlar başarıyla Text File a yazıldı");

    }

    @Override

    public void LogError() {

        System.out.println("Hata niteliğindeki mesajlar başarıyla Text File a yazıldı");

    }

}

public class DBLogger implements Logger {

    @Override

    public void LogInfo() {

        System.out.println("Bilgi niteliğindeki mesajlar başarıyla DB ye yazıldı");

    }

    @Override

    public void LogWarning() {

        System.out.println("Uyarı niteliğindeki mesajlar başarıyla DB ye yazıldı");

    }

    @Override

    public void LogError() {

        System.out.println("Hata niteliğindeki mesajlar başarıyla DB ye yazıldı");

    }

}

Logger tiplerimizi de ayrı ayrı tanımladıktan sonra sıra geldi Factory desenini uygulamamızda doğru şekilde kullanmaya. Fark ettiyseniz bu ana kadar yaptıklarımız tamamen object oriented terminolojisini uygulayarak yaptığımız şeyler. Tam bu noktada Factory deseni der ki;

Her ne kadar sen şu anda log tutmak için DBLogger sınıfını kullanacak olsan da günün birinde diğer logger tiplerini de kullanmak isteyebilirsin. O zaman sen bir adet logger fabrikası kur, DBLogger ı kullanmak istediğinde sana DBLogger sınıfından bir nesne üretip versin, TextFilelogger ı kullanmak istediğinde sana TextFilelogger sınıfından bir nesne üretip versin”.Factory desenin önerisini uygulayalım o zaman.

public class LoggerFactory {   

    public Logger getLogger(LoggerType loggerType){

        if(loggerType==null){

            return null;

        }

        if(loggerType==LoggerType.TxtFileLogger)

            return new TextFileLogger();

        else if(loggerType==LoggerType.DBLogger)

            return new DBLogger();

        return null;

    }

}

Böylece log uygulamamızın çatısı tamamlanmış oldu.Bundan sonra yapmamız gereken log tutmak istediğimiz noktalarda LoggerFactory sınıfından bize bir logger tipi üretmesini isteyeceğiz ve bu tip sayesinde de ilgili metotlara ulaşacağız.

public class Uygulama {

    public static void main(String[] args) {

        LoggerFactory loggerFactory=new LoggerFactory();

        Logger dbLogger=loggerFactory.getLogger(LoggerType.DBLogger);

        dbLogger.LogInfo();

        dbLogger.LogWarning();

        dbLogger.LogError();

    }

Uygulamamızı çalıştırdığımızda ise sonuç aşağıdaki gibi olacaktır ;

--- Bilgi niteliğindeki mesajlar başarıyla DB ye yazıldı

--- Uyarı niteliğindeki mesajlar başarıyla DB ye yazıldı

--- Hata niteliğindeki mesajlar başarıyla DB ye yazıldı

Uygulamamıza genel olarak baktığımızda Factory deseni bize ne sağladı derseniz; en kolay anlatımı ile oluşturulan fabrika yapısındaki bilgiye bağlı olarak, çok sayıdaki benzer sınıflar arasından doğru seçimi yapıp gereken nesnenin yaratılmasını sağladı. Yarın bir gün eğer ki ben logları databasede tutmaya karar versem tek yapmam gereken Uygulama class ı içerisindeki factory nesnesini aşağıdaki gibi oluşturmam yeterli olacaktır:

        Logger dbLogger=loggerFactory.getLogger(LoggerType.TxtFileLogger);

Gördüğünüz gibi küçük bir değişiklikle uygulamayı farklı bir akışa yönlendirmiş oldum. Uygulamayı çalıştırdığımızda göreceksiniz ki bundan sonra loglarımız text file yazılmaya başlayacak.

--- Bilgi niteliğindeki mesajlar başarıyla Text File a yazıldı

--- Uyarı niteliğindeki mesajlar başarıyla Text File a yazıldı

--- Hata niteliğindeki mesajlar başarıyla Text File a yazıldı

Görüşmek dileğiyle…

Yazıyı beğendiyeseniz sosyal medyada paylaşabilirsiniz.

Yazar Hakkında

Avatar
Ali Çevik

cialis generic kamagra gel cheap cialis uk levitra uk cialis generic kamagra gel kamagra 100mg cheap cialis uk cheap levitra uk cheap cialis kamagra 100mg cialis tadalafil kamagra oral jelly cialis buy viagra generic levitra uk kamagra gel cialis generic cheap levitra cheap viagra uk

Yorumlar

  1. Avatar
    Smithd133

    11/02/2018

    Fantastic beat ! I wish to apprentice while you amend your website, how can i subscribe for a blog web site? The account aided me a acceptable deal. I had been a little bit acquainted of this your broadcast offered bright clear concept egkecbcdddecckbe

Yorum Yazın

.com

Bülten Üyeliği

Güncel eğitim ve etkinliklerden ilk haberdar olmak için ücretsiz abone olun.

Login

Login olmak için kullanıcı adınızı ve şifrenizi giriniz.

Şifremi Unuttum

×

Hızlı İletişim

Her konuda bana yazabilirsiniz. En kısa zamanda cevap vereceğim.

×