Builder Pattern
Kurucu Kalıbı
- Okunuşu
- bildır petırn
Kısaca
Builder 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.
Builder pattern nedir?
Bir nesnenin çok sayıda seçeneği olduğunda constructor'ları kullanmak zorlaşır. new HttpRequest("GET", url, null, 30, true, false, headers) okunmaz; her kombinasyon için bir constructor eklemek, yani teleskopik constructor sorunu, durumu daha da kötüleştirir. Builder yalnızca ihtiyacınız olanı adıyla belirlemenize, sonra nesneyi oluşturmanıza izin verir: HttpRequest.builder().url(url).timeout(30).header("Accept", "json").build().
Builder ayarları toplar, varsayılanları uygular ve son nesneyi, çoğu zaman değiştirilemez (immutable) bir nesneyi oluşturmadan önce kombinasyonu doğrular. Bu, nesnenin hiçbir zaman yarı yapılandırılmış bir durumda görülmediği ve "bir POST isteğinin gövdesi olmalı" gibi kuralların tek bir yerde, build() içinde kontrol edilebildiği anlamına gelir.
1994'ten gelen ilk Gang of Four oluşturucu (creational) kalıplarından biridir ve özellikle Java ile C#'ta yaygındır; orada Lombok'un @Builder'ı ya da kod üreteçleri kalıp kodu ortadan kaldırır. Test verisi builder'ları da aynı fikri, mantıklı varsayılanlarla nesneler oluşturup yalnızca testin önemsediği şeyi değiştirmek için kullanır. ORM'lerdekiler gibi sorgu builder'ları ve Java'nın StringBuilder'ı da adım adım tarzı izler.
Sık yapılan bir yanlış, her sınıfın bir builder'a ihtiyacı olduğunu düşünmektir. Python, Kotlin, C# ve seçenek nesneleriyle JavaScript gibi adlandırılmış ve varsayılan parametreleri olan dillerde düz bir constructor çoğu zaman aynı ölçüde açıktır. Builder'lar, çok sayıda isteğe bağlı parçası, karmaşık doğrulaması olan ya da değiştirilemez olması gereken nesneler için işe yarar.
Önemli noktalar
- Builder, karmaşık nesneleri adlandırılmış ayarlarla adım adım oluşturur.
- Teleskopik constructor sorununu çözer.
- build(), nesneyi oluşturmadan önce varsayılanları uygular ve doğrular.
- Java ve C#'ta yaygındır, çoğu zaman Lombok gibi araçlarla üretilir.
- Adlandırılmış ve varsayılan parametreler çoğu zaman onu gereksiz kılar.
Örnek
public final class Email {
private final String to, subject, body;
private final List<String> cc;
private Email(Builder b) { to = b.to; subject = b.subject; body = b.body; cc = List.copyOf(b.cc); }
public static Builder builder() { return new Builder(); }
public static final class Builder {
private String to, subject = "(no subject)", body = "";
private final List<String> cc = new ArrayList<>();
public Builder to(String v) { to = v; return this; }
public Builder subject(String v) { subject = v; return this; }
public Builder body(String v) { body = v; return this; }
public Builder cc(String v) { cc.add(v); return this; }
public Email build() {
if (to == null) throw new IllegalStateException("Recipient is required");
return new Email(this); // immutable, never half-configured
}
}
}
Email email = Email.builder().to("ada@example.com").subject("Welcome").cc("team@example.com").build();Sık sorulan sorular
Builder pattern'ı ne zaman kullanmalıyım?
Bir nesnenin çok sayıda isteğe bağlı parametresi olduğunda, birkaç alan üzerinde doğrulama gerektirdiğinde ya da oluşturulduktan sonra değiştirilemez olması gerektiğinde. Birkaç zorunlu alanı olan nesneler için constructor daha basittir.
Builder ile factory kalıpları arasındaki fark nedir?
Factory hangi nesnenin oluşturulacağına karar verir ve onu tek bir çağrıda döndürür. Builder ise tek bir karmaşık nesneyi oluşturmadan önce birkaç adımda yapılandırmaya odaklanır.
Akıcı arayüz (fluent interface) nedir?
Her metodun nesnenin kendisini döndürdüğü bir API'dir; böylece çağrılar builder.to(...).subject(...).build() gibi okunur bir cümleye zincirlenebilir. Builder'lar genellikle bu şekilde yazılır.
İ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.
- Factory DeseniYazılım Mimarisi, s. 15Factory 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.
- DeğişmezlikProgramlamanın Temelleri, s. 11Değişmezlik, bir değerin oluşturulduktan sonra değiştirilememesi demektir; her güncelleme, orijinali yerinde değiştirmek yerine yeni bir değer üretir.
- 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.
- SınıfProgramlamanın Temelleri, s. 49Sınıf, nesne yönelimli programlamada bir grup nesnenin paylaştığı veri ve davranışı tanımlayan, nesnelerin örnek olarak ondan oluşturulduğu bir plandır.
- NesneProgramlamanın Temelleri, s. 39Nesne, ilgili veriyi ve davranışı bir arada tutan yapıdır: değerleri özellik denen adlandırılmış alanlarda, onları işleyen fonksiyonları metot olarak taşır.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin