Шаблон компоновщика популярен для создания неизменяемых объектов, но для создания строителя есть некоторые накладные расходы на программирование. Поэтому мне интересно, почему бы просто не использовать объект конфигурации.
Использование построителя будет выглядеть так:
Product p = Product.name("Vodka").alcohol(0.38).size(0.7).price(17.99).build();
Очевидно, что это очень читаемо и кратким, но вы должны реализовать построитель:
public class Product {
public final String name;
public final float alcohol;
public final float size;
public final float price;
private Product(Builder builder) {
this.name = builder.name;
this.alcohol = builder.alcohol;
this.size = builder.size;
this.price = builder.price;
}
public static class Builder {
private String name;
private float alcohol;
private float size;
private float price;
// mandatory
public static Builder name(String name) {
Builder b = new Builder();
b.name = name;
return b;
}
public Builder alcohol(float alcohol) {
this.alcohol = alcohol;
return.this;
}
public Builder size(float size) {
this.size = size;
return.this;
}
public Builder price(float price) {
this.price = price;
return.this;
}
public Product build() {
return new Product(this);
}
}
}
Моя идея состоит в том, чтобы уменьшить код с помощью простого объекта конфигурации, подобного этому:
class ProductConfig {
public String name;
public float alcohol;
public float size;
public float price;
// name is still mandatory
public ProductConfig(String name) {
this.name = name;
}
}
public class Product {
public final String name;
public final float alcohol;
public final float size;
public final float price;
public Product(ProductConfig config) {
this.name = config.name;
this.alcohol = config.alcohol;
this.size = config.size;
this.price = config.price;
}
}
Использование:
ProductConfig config = new ProductConfig("Vodka");
config.alcohol = 0.38;
config.size = 0.7;
config.price = 17.99;
Product p = new Product(config);
Это использование требует еще нескольких строк, но также очень читаемо, но реализация намного проще и, возможно, его легче понять для тех, кто не знаком с шаблоном построителя. Кстати: есть ли название для этого шаблона?
Есть ли недостаток в подходе конфигурации, который я забыл?