Шаблон строителя популярен для создания неизменяемых объектов, но для создания строителя есть некоторые накладные расходы на программирование. Поэтому я удивляюсь, почему бы просто не использовать объект конфигурации.Builder pattern vs. config object
Использование строитель будет выглядеть следующим образом:
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);
Такое использование необходимо еще несколько строк, но также очень удобным для чтения, но реализация гораздо проще и, возможно, легче понять, для кого-то, кто не знаком с моделью строитель. Кстати: есть ли название для этого шаблона?
Есть ли недостаток в настройке конфигурации, который я забыл?
В 'Builder' ваши сеттеры должны« вернуть это », потому что шаблон работает. – rsp
Спасибо! Я должен был проверить свой код ... – deamon
С помощью подхода к объекту config вы также можете сделать вещи безопасными, используя фантомные типы. То есть, компилятор позволит вам передать экземпляр config в исходный конструктор только тогда, когда будут установлены все необходимые поля. См. Http://michid.wordpress.com/2008/08/13/type-safe-builder-pattern-in-java/ – michid