Builder Tasarım Deseni

Hepimizin sıklıkla karşılaştığı bir sınıf constructor(yapıcı metot) görüntüsünü aşağıda veriyorum. Fazla yabancı değiliz buna.
1
2
3
4
|
Pizza(int size) { ... }
Pizza(int size, boolean cheese) { ... }
Pizza(int size, boolean cheese, boolean pepperoni) { ... }
Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon) { ... }
|
Bir pizza sınıfımız var ve bunun objesini oluştururken önümüze hangi parametreler ile oluşturabileceğimize dair seçeneklerden bir kaçı.Bu Constructor tasarım desenine Teleskobik constructor deseni deniyor.Bu patterndeki problem 4-5 parametreli constructorları sırasıyla hatırlamak kolay olmuyor.
Bu teleskobik dizaynın yanı sıra bir de şöyle bir alternatifimiz var.
1
2
3
4
|
Pizza pizza = new Pizza(12);
pizza.setCheese(true);
pizza.setPepperoni(true);
pizza.setBacon(true);
|
Burada da pizzanın boyutu verilerek bir nesne oluşturulmuş. Ve her bir özelliği yaratılırken aynı nesneyi çağırmış.Buradaki sorun ise nesne oluşturulmuş.Ve bu nesneyi oluşturduktan sonra her özelliğini tek tek çağıra çağıra doldurmuşuz.Haliyle Thread safety sağlamak için ekstra efor sarf edeceğiz.
Daha iyi bir alternatif olarak Builder Design Pattern’i kullanabiliriz. Builder tasarım desenindeki mantık her işlemi adım adım yaparak en son bir nesne sunmak.Örneğin ben bir Car.class ‘ı oluşturdum ve inner class olarak bir Builder yazdım.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
public class Car {
private double price;
private String color,brand;
private int year;
private boolean isSecondHand;
public static class Builder
{
private final double price;
private String color,brand;
private int year;
private boolean isSecondHand;
public Builder(double price) {
this.price = price;
}
public Builder setColor(String color)
{
this.color = color;
return this;
}
public Builder setBrand(String brand)
{
this.brand = brand;
return this;
}
public Builder setYear(int year)
{
this.year = year;
return this;
}
public Builder secondHand(boolean isSecondHand)
{
this.isSecondHand = isSecondHand;
return this;
}
public Car build()
{
return new Car(this);
}
}
private Car(Builder builder)
{
price = builder.price;
brand = builder.brand;
color = builder.color;
isSecondHand = builder.isSecondHand;
year = builder.year;
}
}
|
Artık bir araba nesnesi oluştururken kolayca şu şekilde oluşturabilirim:
1
2
3
4
5
6
7
8
9
10
11
12
|
public class Test {
public static void main(String[] args) {
Car myCar = new Car.Builder(1250.12)
.setBrand(“Opel”)
.secondHand(true)
.setColor(“Black”)
.setYear(1995)
.build();
}
}
|
Builder Pattern’i bir kartopu gibi düşünebiliriz. Nasıl ki kartopu yuvarlaya yuvarlaya büyür ve istediğimiz büyüklükte bir kartopu oluştururuz.Builder tasarım deseninde de nesnenin parçalarını tek tek inşa eder ve en son istenilen nesneyi oluştururuz.