Middle
Yapı Tasarım Deseni 'Builder' nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Tasarım deseni "Builder" (İnşaatçı), karmaşık bir nesneyi adım adım oluşturmak için bir yöntem sağlayan yaratıcı bir tasarım desenidir. Bu desen, karmaşık bir nesnenin inşası sürecini onun temsilinden ayırır, böylece aynı inşaat süreci farklı temsiller oluşturmak için kullanılabilir.
Desenin temel bileşenleri:
- Builder: Ürünün parçalarını adım adım inşa etmek için bir yöntem kümesi tanımlayan soyut veya somut arayüz (veya sınıf).
- ConcreteBuilder: Ürünün belirli bir temsilini oluşturan somut uygulama. İnşaatın tüm detaylarını bilir.
- Director: Opsiyonel, ancak sık kullanılan bir sınıf. Ürünün belirli bir konfigürasyonunu oluşturmak için inşaat adımlarının çağrı sırasını belirler.
- Product: İnşa edilen karmaşık nesne. Birçok parçadan oluşur.
Avantajlar:
- Karmaşık nesneleri adım adım oluşturmayı sağlar, böylece "teleskopik" yapıcılar (çok parametreli yapıcılar) önlenir.
- Karmaşık nesnenin oluşturulma mantığını kapsüller.
- Ürünün iç temsilinde değişiklik yapmayı kolaylaştırır.
- Aynı inşaat sürecini kullanarak farklı ürün varyantları oluşturmayı sağlar.
Uygulama alanları:
- Bir nesnenin oluşturulma süreci birçok adım içeriyorsa ve bu adımlar belirli bir sırayla yapılmalıysa.
- Aynı nesnenin farklı temsillerine ihtiyaç varsa.
- Nesne yapıcısının çok sayıda opsiyonel parametresi varsa.
Örnek:
// Ürün
class Pizza {
private String dough = "";
private String sauce = "";
private List<String> toppings = new ArrayList<>();
public void setDough(String dough) {
this.dough = dough;
}
public void setSauce(String sauce) {
this.sauce = sauce;
}
public void addTopping(String topping) {
this.toppings.add(topping);
}
@Override
public String toString() {
return "Pizza ile hamur: " + dough + ", sos: " + sauce + ", malzemeler: " + toppings;
}
}
// Builder arayüzü
interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildToppings();
Pizza getPizza();
}
// Somut Builder
class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza = new Pizza();
@Override
public void buildDough() {
pizza.setDough("ince hamur");
}
@Override
public void buildSauce() {
pizza.setSauce("domates");
}
@Override
public void buildToppings() {
pizza.addTopping("mozzarella");
pizza.addTopping("fesleğen");
}
@Override
public Pizza getPizza() {
return this.pizza;
}
}
// Yönetici (opsiyonel)
class Cook {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
}
public Pizza getPizza() {
return pizzaBuilder.getPizza();
}
public void constructPizza() {
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildToppings();
}
}
// Kullanım
public class BuilderExample {
public static void main(String[] args) {
Cook cook = new Cook();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();
cook.setPizzaBuilder(margheritaBuilder);
cook.constructPizza();
Pizza margherita = cook.getPizza();
System.out.println(margherita);
}
}
Test otomasyon bağlamında, "Builder" genellikle test verileri veya karmaşık test nesneleri (örneğin, çok sayıda özelliğe sahip bir kullanıcı nesnesi, birkaç pozisyona sahip bir sipariş nesnesi) oluşturmak için kullanılır; bu, farklı test senaryoları için bu verilerin çeşitli varyantlarını esnek bir şekilde yapılandırmayı gerektirir.