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.
Görev
KolayBuilder 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 birPizzasınıfı oluştur. Pizzan aşağıdaki alanlara sahip olmalı:size(String) - zorunlu, pizzanın boyutunu temsil edercheese(boolean) - isteğe bağlı, varsayılan değeri falsepepperoni(boolean) - isteğe bağlı, varsayılan değeri falsemushrooms(boolean) - isteğe bağlı, varsayılan değeri falsePizzakurucusu private olmalı ve parametre olarak yalnızca birPizzaBuilderkabul 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ızcano toppingsdemelidir.Şunları içeren statik bir iç sınıf
PizzaBuilderoluştur:- Zorunlu
sizeparametresini alan bir kurucu - Her biri kendi boolean değerini true yapan ve zincirleme kullanım için
cheese()döndürenpepperoni(),mushrooms()vethisyöntemleri - Yeni bir
build()döndüren birPizzayöntemi
- Zorunlu
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
PizzaBuilderoluş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çinbuild()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
}
}
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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici KalıbıKendi başına pratik yap: Online Java derleyicisi