Merhabalar, bu konumda başlıkta yazdığı gibi GoF(Gang of Four) sistematiğinde bulunan kalıplardan Factory method ve Singleton ile ilgili bahsedeceğim.
Creational Kalıplar
Factory method ve singleton konularına geçmeden önce bu iki kalıbın bulunduğu Creational Kalıplar kısmına göz atalım.
Bu kalıplar nesneye yönelik proglamlamanın en yaygın görevlerinden birisi olan yazılım sistemindeki nesnelerin yaratılması hakkında yol göstermektedir.
Factory Method
Günlük hayattan örnek verirsek eğer bazı nesneleri veya varlıkları yaratmak oldukça basittir ve biz kendimiz de yaratabiliriz. Mesela basit bir zil sistemini evde ihtiyaç duyduğumuz malzemeleri temin ederek kendimiz yapabiliriz. Fakat yine günlük hayatta kendi başımıza yapamayacağımız oldukça karmaşık nesneler veya varlıklar vardır. Buna da örnek verirsek evde gerekli malzemeleri temin etsek bile bir televizyon yapamayız. Bu tür nesneleri özel fabrikalar üretir -üretimin detaylarını tüketiciden gizleyerek- ve biz de(tüketiciler) o fabrikanın ürettiği nesneleri kullanırız. Bazı nesneler doğrudan kullanıcısı tarafından yaratılabilmektedir. Bunun anlamı; sınıfın başlangıç fonksiyonunu (new operatörü) kullanarak nesnenin yaratılmasıdır. Ancak bazı nesnelerin (Product) kullanıcı (Client) olarak erişebileceğimiz başlangıç fonksiyonları bulunmamaktadır.
Client olan nesne Factory nesnesini kullanarak Product'ı elde eder.
CLIENT => FACTORY => PRODUCT
İstenen tipte yeni nesne oluşturma sürecinin Factory sınıfına aktarılması ile birlikte nesne üretme ve initialize etme süreci Client'ten soyutlanmış olur. Bu sayede Client, tamamen kendi işine odaklanabilir.


Product: Factory tarafından yaratılan nesnenin arayüzü.
ConcreteProduct: Product arayüzünü implemente eden sınıf. Bu sınıfın nesneleri ConcreteCreator tarafından yaratılır.
Creator: Factory methodunu (factoryMethod) tanımlayan arayüz.
ConcreteCreator: Creator sınıfını genişleten ve factoryMethod için bir implementasyon sağlayan sınıftır.
Singleton Tasarım Kalıbı
Uygulamamızda global bir nesneye ihtiyaç duyulabilir. Bu nesne her yerden erişilebilir olmalı fakat sadece bir kez yaratılmalıdır. Uygulamanızın tüm parçalarının bu nesneyi kullanmasını fakat tümünün aynı instance'ı kullanmasını isteyebilirsiniz. Bunu başarmanın tek yolu, ana uygulamada global bir nesne yaratılması ve sonrasında bu nesnenin referansının ihtiyaç olduğunda geçirilmesini sağlanmasıdır. Global değerler yaratılması için diğer bir yol ise static değişkenler kullanmaktır. Uygulama bir sınıfın içerisinde birkaç static nesneye sahip olmakta ve onlara direkt ulaşmaktadır. Nesne yaratma üzerindeki kontrolden emin olmak için kurucu metot private olarak tanımlanmalıdır. Bu yöntem ise bir sorun doğurur: bir instance yaratılması imkansız olur. Bundan dolayı erişimci bir metot static bir metot tarafından sağlanır. Bu metot daha önce yaratılmadıysa, yeni tek bir tane instance yaratır ve singleton'un referansını bu nesneyi çağıran fonksiyona döner. Singleton'un referansı ise sınıfından tanımlanan static bir property'de saklanır.

Örneğin bir multi-thread uygulama geliştiriyor isek deseni thread safe oluşturmak önemlidir. Aksi takdirde teklik sağlanmamış olur.
Örnek - ConnectionProvider:
– Veritabanına bağlı çalışan bir E-Ticaret uygulaması yazdığınızı düşünün.
– Binlerce kullanıcı aynı anda sisteme bağlanmış ürünleri inceliyor, satın alma işlemleri gerçekleştiriyor.
– Veritabanına bağlantı sağlayan bir Connection sınıfınız var ve her manipülasyon işleminde Connection sınıfından tekrar tekrar instance alınacak şekilde kod yazamayız.
Umarım verimli bir konu olmuştur...
Creational Kalıplar
Factory method ve singleton konularına geçmeden önce bu iki kalıbın bulunduğu Creational Kalıplar kısmına göz atalım.
Bu kalıplar nesneye yönelik proglamlamanın en yaygın görevlerinden birisi olan yazılım sistemindeki nesnelerin yaratılması hakkında yol göstermektedir.
Factory Method
Günlük hayattan örnek verirsek eğer bazı nesneleri veya varlıkları yaratmak oldukça basittir ve biz kendimiz de yaratabiliriz. Mesela basit bir zil sistemini evde ihtiyaç duyduğumuz malzemeleri temin ederek kendimiz yapabiliriz. Fakat yine günlük hayatta kendi başımıza yapamayacağımız oldukça karmaşık nesneler veya varlıklar vardır. Buna da örnek verirsek evde gerekli malzemeleri temin etsek bile bir televizyon yapamayız. Bu tür nesneleri özel fabrikalar üretir -üretimin detaylarını tüketiciden gizleyerek- ve biz de(tüketiciler) o fabrikanın ürettiği nesneleri kullanırız. Bazı nesneler doğrudan kullanıcısı tarafından yaratılabilmektedir. Bunun anlamı; sınıfın başlangıç fonksiyonunu (new operatörü) kullanarak nesnenin yaratılmasıdır. Ancak bazı nesnelerin (Product) kullanıcı (Client) olarak erişebileceğimiz başlangıç fonksiyonları bulunmamaktadır.
Client olan nesne Factory nesnesini kullanarak Product'ı elde eder.
CLIENT => FACTORY => PRODUCT
İstenen tipte yeni nesne oluşturma sürecinin Factory sınıfına aktarılması ile birlikte nesne üretme ve initialize etme süreci Client'ten soyutlanmış olur. Bu sayede Client, tamamen kendi işine odaklanabilir.


Product: Factory tarafından yaratılan nesnenin arayüzü.
ConcreteProduct: Product arayüzünü implemente eden sınıf. Bu sınıfın nesneleri ConcreteCreator tarafından yaratılır.
Creator: Factory methodunu (factoryMethod) tanımlayan arayüz.
ConcreteCreator: Creator sınıfını genişleten ve factoryMethod için bir implementasyon sağlayan sınıftır.
Singleton Tasarım Kalıbı
Uygulamamızda global bir nesneye ihtiyaç duyulabilir. Bu nesne her yerden erişilebilir olmalı fakat sadece bir kez yaratılmalıdır. Uygulamanızın tüm parçalarının bu nesneyi kullanmasını fakat tümünün aynı instance'ı kullanmasını isteyebilirsiniz. Bunu başarmanın tek yolu, ana uygulamada global bir nesne yaratılması ve sonrasında bu nesnenin referansının ihtiyaç olduğunda geçirilmesini sağlanmasıdır. Global değerler yaratılması için diğer bir yol ise static değişkenler kullanmaktır. Uygulama bir sınıfın içerisinde birkaç static nesneye sahip olmakta ve onlara direkt ulaşmaktadır. Nesne yaratma üzerindeki kontrolden emin olmak için kurucu metot private olarak tanımlanmalıdır. Bu yöntem ise bir sorun doğurur: bir instance yaratılması imkansız olur. Bundan dolayı erişimci bir metot static bir metot tarafından sağlanır. Bu metot daha önce yaratılmadıysa, yeni tek bir tane instance yaratır ve singleton'un referansını bu nesneyi çağıran fonksiyona döner. Singleton'un referansı ise sınıfından tanımlanan static bir property'de saklanır.

Örneğin bir multi-thread uygulama geliştiriyor isek deseni thread safe oluşturmak önemlidir. Aksi takdirde teklik sağlanmamış olur.
Örnek - ConnectionProvider:
– Veritabanına bağlı çalışan bir E-Ticaret uygulaması yazdığınızı düşünün.
– Binlerce kullanıcı aynı anda sisteme bağlanmış ürünleri inceliyor, satın alma işlemleri gerçekleştiriyor.
– Veritabanına bağlantı sağlayan bir Connection sınıfınız var ve her manipülasyon işleminde Connection sınıfından tekrar tekrar instance alınacak şekilde kod yazamayız.
Umarım verimli bir konu olmuştur...


