Factory Deseni
- İngilizcesi
- Factory Pattern
- Türkçe karşılığı
- fabrika deseni
- Okunuşu
- fektıri petırn
Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.
Kısaca
Factory deseni, nesne oluşturmayı özel bir fonksiyona ya da sınıfa taşıyan ve çağıranların somut sınıfı hiç adlandırmadığı oluşturucu bir tasarım desenidir.
Factory deseni nedir?
Factory deseni, new SomeClass() çağrılarını kod tabanına dağıtmak yerine nesne oluşturma işini tek bir yere, yani bir factory'ye koyar. Çağıranlar factory'den bir arayüze uyan bir nesne ister; hangi somut sınıfın oluşturulacağına ve nasıl yapılandırılacağına factory karar verir. Bu, kodun geri kalanını belirli uygulamalardan bağımsız tutar; yenilerini eklemeyi ya da testlerde değiştirmeyi kolaylaştırır.
Ad birkaç ilişkili çeşidi kapsar. Basit factory (simple factory), girdiye göre çoğunlukla switch ifadesiyle farklı sınıflar döndüren bir fonksiyon ya da statik metottur. Klasik Gang of Four kitabındaki factory method deseni, alt sınıfların hangi nesnenin oluşturulacağına karar vermek için bir oluşturma metodunu geçersiz kılmasına izin verir; abstract factory deseni ise açık ya da koyu tema için birbirine uyan düğmeler ve menüler gibi ilişkili nesnelerin bütün ailelerini oluşturmak için bir arayüz sağlar.
Araba kiralama masası gibi çalışır: kompakt bir araba istersiniz ve masa, kimin ürettiğini bilmenize gerek kalmadan müsait olan kompakt modeli teslim eder. Factory'ler bir depolama arka ucunu, ödeme sağlayıcısını ya da logger'ı yapılandırmadan seçmek, dosya türüne göre bir ayrıştırıcı (parser) seçmek ve doğru ayarlarla veritabanı bağlantıları veya HTTP istemcileri oluşturmak için yaygındır.
Factory deseni sıklıkla builder deseni ve dependency injection ile karıştırılır. Builder tek bir karmaşık nesneyi bir dizi metot çağrısıyla adım adım oluşturur; factory ise hazır bir nesneyi tek çağrıda döndürür. Dependency injection bir nesnenin bağımlılıklarını dışarıdan kimin sağladığıyla ilgilidir ve DI container'lar iç işleyişinde factory kullanır, ama tek başına bir factory hiçbir şey enjekte etmez. Her desen gibi factory de dolaylılık ekler; bu yüzden yalnızca uygulamalar arasında gerçek bir seçim olduğunda değerlidir.
Önemli noktalar
- Factory, nesne oluşturmayı tek bir fonksiyon ya da sınıfın arkasında merkezileştirir.
- Çağıranlar, oluşturulan somut sınıfa değil, bir arayüze bağımlıdır.
- Çeşitleri arasında simple factory, factory method ve abstract factory bulunur.
- Builder tek bir nesneyi adım adım oluşturur; factory onu tek çağrıda döndürür.
- Uygulamalar arasında gerçek bir seçim olduğunda factory kullanın.
Örnek
interface Storage {
save(key: string, data: string): Promise<void>;
}
class LocalDiskStorage implements Storage { async save() { /* write to disk */ } }
class CloudStorage implements Storage { async save() { /* upload to object storage */ } }
// The factory decides which concrete class to create
function createStorage(kind: "local" | "cloud"): Storage {
return kind === "cloud" ? new CloudStorage() : new LocalDiskStorage();
}
// Callers only know about the Storage interface
const storage = createStorage(process.env.STORAGE === "cloud" ? "cloud" : "local");
await storage.save("report.txt", "Quarterly numbers");Sık sorulan sorular
Factory method ile abstract factory arasındaki fark nedir?
Factory method tek bir tür nesne oluşturur ve somut sınıfa alt sınıfların ya da yapılandırmanın karar vermesine izin verir. Abstract factory ise birlikte kullanılması amaçlanan ilişkili nesneler ailesi üretmek için birkaç oluşturma metodunu gruplar.
Factory deseni ile builder deseni arasındaki fark nedir?
Factory hazır bir nesneyi tek çağrıda döndürür ve hangi sınıfı seçtiğini gizler. Builder ise build() gibi son bir metodu çağırmadan önce seçenekleri tek tek ayarlayarak tek bir karmaşık nesneyi adım adım oluşturmanıza olanak tanır.
Factory deseni ne zaman kullanılmalı?
Oluşturulacak sınıf yapılandırmaya, girdiye ya da ortama bağlı olduğunda veya oluşturma her yerde tekrarlanmasını istemediğiniz bir kurulum içerdiğinde kullanın. Yalnızca tek bir uygulama varsa sade bir constructor daha basittir.
İlgili sayfalar
- Tasarım DeseniYazılım Mimarisi, s. 42Tasarım deseni, yazılım tasarımında sık görülen bir soruna kanıtlanmış, yeniden kullanılabilir çözümdür; hazır kod değil, genel bir şablon olarak anlatılır.
- InterfaceProgramlamanın Temelleri, s. 26Interface, bir türün sağlamayı vaat ettiği metot ve özellik imzalarından oluşan adlandırılmış bir kümedir; bu üyelerin nasıl gerçekleştirildiğini söylemez.
- Çok biçimlilikProgramlamanın Temelleri, s. 8Çok biçimlilik, kodun farklı türlerdeki değerlerle ortak bir arayüz üzerinden çalışabilmesidir; her tür kendi davranışını sağlar.
- Dependency InjectionYazılım Mimarisi, s. 10Dependency injection, bir nesnenin ihtiyaç duyduğu diğer nesneleri kendisi oluşturmak yerine dışarıdan almasını sağlayan bir tasarım tekniğidir.
- Strategy DeseniYazılım Mimarisi, s. 41Strategy deseni, değiştirilebilir algoritmaları tek arayüzün arkasına koyup çalışma zamanında aralarında geçiş yapılmasını sağlayan davranışsal bir desendir.
- Singleton DeseniYazılım Mimarisi, s. 38Singleton deseni, bir sınıfın yalnızca tek bir örneğinin bulunmasını sağlayan ve ona tek, küresel bir erişim noktası sunan oluşturucu bir tasarım desenidir.
- Builder PatternYazılım Mimarisi, s. 3Builder pattern, karmaşık bir nesneyi ayrı bir builder nesnesiyle, argümanlarla dolu uzun bir constructor yerine adlandırılmış adımlarla adım adım oluşturur.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin