Middle
Yapı tasarım deseni 'Builder' nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
"Builder" (İnşaatçı) deseni, karmaşık nesneleri adım adım oluşturmak için tasarlanmış bir yaratıcı tasarım desenidir. Karmaşık bir nesnenin inşası sürecini, aynı inşaat sürecinin farklı temsiller oluşturabileceği şekilde, nesnenin kendisinden ayırır.
Çalışma prensipleri:
- Ayrım: Nesnenin oluşturulma mantığını, nesnenin kendisinden ayırır.
- Delege etme: Müşteri kodu (Director), nesnenin oluşturulmasını ayrı bir sınıfa (Builder) devreder.
- Adım adım oluşturma: Nesne, bir dizi builder yöntemi kullanılarak bileşenlerden oluşturulur.
Ana katılımcılar:
- Product: Oluşturmak istediğimiz karmaşık nesne. Oluşum sürecinden bağımsızdır.
- Builder: Product'u oluşturmak için adımları tanımlayan soyut arayüz.
- ConcreteBuilder: Builder'ın somut uygulaması, inşa adımlarını gerçekleştirir ve tamamlanmış Product'u almak için bir yöntem sağlar.
- Director (İsteğe bağlı): İnşa adımlarının çağrı sırasını belirler. Zorunlu değildir, müşteri kodu doğrudan ConcreteBuilder ile etkileşime geçebilir.
Avantajlar:
- Çok sayıda isteğe bağlı parametre içeren nesneleri, çok argümanlı yapıcılar veya setter zincirleri kullanmaktan daha okunabilir şekilde oluşturmayı sağlar.
- Aynı inşaat sürecini kullanarak farklı varyasyonlar oluşturmayı mümkün kılar.
- Oluşturulan nesnenin iç yapısını gizler.
Dezavantajlar:
- Projede sınıf sayısını artırabilir (Builder, ConcreteBuilder, Product, Director).
Kullanım örneği: Farklı malzemelerle Pizza sınıfı nesnesi oluşturma.
// Product
public class Pizza {
private String dough;
private String sauce;
private String cheese;
private List<String> toppings;
public void setDough(String dough) { this.dough = dough; }
public void setSauce(String sauce) { this.sauce = sauce; }
public void setCheese(String cheese) { this.cheese = cheese; }
public void setToppings(List<String> toppings) { this.toppings = toppings; }
@Override
public String toString() {
return "Pizza with dough=" + dough + ", sauce=" + sauce + ", cheese=" + cheese + ", toppings=" + toppings;
}
}
// Builder
public interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildCheese();
void addTopping(String topping);
Pizza getPizza();
}
// ConcreteBuilder
public class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza;
public MargheritaPizzaBuilder() {
this.pizza = new Pizza();
this.pizza.setToppings(new ArrayList<>()); // Listeyi başlat
}
@Override
public void buildDough() {
pizza.setDough("İnce hamur");
}
@Override
public void buildSauce() {
pizza.setSauce("Domates sosu");
}
@Override
public void buildCheese() {
pizza.setCheese("Mozzarella");
}
@Override
public void addTopping(String topping) {
// Margherita, temel malzemeler dışında topping eklemez
}
@Override
public Pizza getPizza() {
return this.pizza;
}
}
// Director (İsteğe bağlı)
public class Kitchen {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
}
public Pizza getPizza() {
return pizzaBuilder.getPizza();
}
public void constructPizza() {
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildCheese();
// Diğer metodlar, örneğin addTopping() başka bir builder'da çağrılabilir
}
}
Kullanım:
// Müşteri kodu
Kitchen kitchen = new Kitchen();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();
kitchen.setPizzaBuilder(margheritaBuilder);
kitchen.constructPizza();
Pizza margherita = kitchen.getPizza();
System.out.println(margherita); // Çıktı: Pizza with dough=İnce hamur, sauce=Domates sosu, cheese=Mozzarella, toppings=[]