Ana içeriğe geç

Builder Pattern

Kurucu Kalıbı

Okunuşu
bildır petırn
Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/builder-pattern

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

Doğrulamalı bir builder (Java)java
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

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar