Menu
Coddy logo textTech

Builder Kalıbı

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 67 / 87.

Builder Pattern, yaygın bir sorunu çözen oluşturucu bir tasarım desenidir: çok sayıda isteğe bağlı parametreye sahip karmaşık nesnelerin oluşturulması. Birden fazla kurucu oluşturmaya veya kullanılmayan parametreler için null geçirmeye gerek kalmadan Builder, nesneleri adım adım oluşturmanıza olanak tanır.

Gerekli alanlara (name, email) ve isteğe bağlı alanlara (age, phone, address) sahip bir User nesnesi oluşturmayı düşünün. Builder olmadan, aşırı yüklenmiş kuruculara veya çok sayıda parametre içeren karmaşık bir kurucuya ihtiyaç duyardınız. Builder deseni daha temiz bir yaklaşım sunar:

public class User {
    private final String name;    // gerekli
    private final String email;   // gerekli
    private final int age;        // isteğe bağlı
    private final String phone;   // isteğe bağlı
    
    private User(UserBuilder builder) {
        this.name = builder.name;
        this.email = builder.email;
        this.age = builder.age;
        this.phone = builder.phone;
    }
    
    public static class UserBuilder {
        private final String name;
        private final String email;
        private int age;
        private String phone;
        
        public UserBuilder(String name, String email) {
            this.name = name;
            this.email = email;
        }
        
        public UserBuilder age(int age) {
            this.age = age;
            return this;
        }
        
        public UserBuilder phone(String phone) {
            this.phone = phone;
            return this;
        }
        
        public User build() {
            return new User(this);
        }
    }
}

Builder'ın yöntemleri this döndürerek nesneleri oluşturmanın akıcı ve okunabilir bir yolu olan yöntem zincirlemeyi mümkün kılar:

User user = new User.UserBuilder("Alice", "alice@email.com")
    .age(25)
    .phone("555-1234")
    .build();

User yapıcısının private olduğuna dikkat edin: nesneler yalnızca Builder aracılığıyla oluşturulabilir. Bu desen, nesnelerin birçok isteğe bağlı alana sahip olduğu durumlarda öne çıkar ve kodunuzu uzun parametre listelerine kıyasla daha okunabilir ve hataya daha az açık hâle getirir.

challenge icon

Görev

Kolay

Builder Pattern'ı kullanarak bir pizza sipariş sistemi oluşturalım! Olası tüm malzemeler ve seçenekler için düzinelerce parametre alan bir kurucuyla uğraşmak yerine, pizza özelleştirmesini temiz ve okunabilir hâle getiren akıcı bir builder oluşturacaksın.

Kodunu iki dosyaya ayıracaksın:

  • Pizza.java: Oluşturma işlemi için Builder Pattern'ı kullanan bir Pizza sınıfı oluştur. Pizzan aşağıdaki alanlara sahip olmalı:

    size (String) - zorunlu, pizzanın boyutunu temsil eder

    cheese (boolean) - isteğe bağlı, varsayılan değeri false

    pepperoni (boolean) - isteğe bağlı, varsayılan değeri false

    mushrooms (boolean) - isteğe bağlı, varsayılan değeri false

    Pizza kurucusu private olmalı ve parametre olarak yalnızca bir PizzaBuilder kabul etmeli; builder'daki tüm değerleri pizzanın alanlarına kopyalamalıdır.

    Şu biçimde bir dize döndüren getDescription() yöntemi ekle: [size] Pizza with: [toppings]. Burada toppings, değeri true olan malzemelerin virgülle ayrılmış listesidir (Cheese, Pepperoni, Mushrooms). Hiçbir malzeme seçilmezse toppings bölümü yalnızca no toppings demelidir.

    Şunları içeren statik bir iç sınıf PizzaBuilder oluştur:

    • Zorunlu size parametresini alan bir kurucu
    • Her biri kendi boolean değerini true yapan ve zincirleme kullanım için cheese() döndüren pepperoni(), mushrooms() ve this yöntemleri
    • Yeni bir build() döndüren bir Pizza yöntemi
  • Main.java: Pizza builder'ının kullanımını göster! Dört girdi alacaksın: pizza boyutu (String) ve sırasıyla peynir, pepperoni ve mantar eklenip eklenmeyeceğini belirten üç yes/no değeri (String).

    Verilen boyutla bir PizzaBuilder oluştur. Ardından her yes/no girdisine göre uygun malzeme yöntemlerini zincirle. Girdi "yes" ise ilgili malzeme yöntemini çağır; "no" ise atla. Son olarak pizzanı oluşturmak için build() yöntemini çağır.

    Tamamladığın pizzada getDescription() çağrısının sonucunu yazdır.

Dört girdiyi şu sırayla alacaksın: boyut (String), peynir ekle (String: "yes" veya "no"), pepperoni ekle (String: "yes" veya "no"), mantar ekle (String: "yes" veya "no").

Örneğin girdiler Large, yes, no, yes olduğunda çıktın şu olur: Large Pizza with: Cheese, Mushrooms

Builder Pattern'ın, her olasılık için ayrı kuruculara ihtiyaç duymadan pizzaları her türlü malzeme kombinasyonuyla oluşturmanı nasıl sağladığına dikkat et!

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Girdileri oku
        String size = scanner.nextLine();
        String addCheese = scanner.nextLine();
        String addPepperoni = scanner.nextLine();
        String addMushrooms = scanner.nextLine();
        
        // TODO: Verilen boyutla bir PizzaBuilder oluştur
        // TODO: Evet/hayır girdilerine göre topping metodlarını zincirle
        // TODO: Pizzayı oluştur ve açıklamasını yazdır
        
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Java derleyicisi