Le générateur de modèle vs objet de config

Le générateur de modèle est populaire pour créer des objets immuables, mais il y a un peu de programmation généraux pour créer un générateur de rapports. Donc, je me demande pourquoi ne pas tout simplement à l'aide d'un objet de config.

L'utilisation d'un constructeur devrait ressembler à ceci:

Product p = Product.Builder.name("Vodka").alcohol(0.38).size(0.7).price(17.99).build();

Il est évident que c'est très lisible et concis, mais vous avez à mettre en œuvre le constructeur:

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);
        }

    }

}

Mon idée est de réduire le code à l'aide d'un simple objet de config comme ceci:

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;
    }

}

Utilisation:

ProductConfig config = new ProductConfig("Vodka");
config.alcohol = 0.38;
config.size = 0.7;
config.price = 17.99;
Product p = new Product(config);

Cette utilisation a besoin d'un peu plus de lignes, mais est également très lisible, mais la mise en œuvre est beaucoup plus simple et peut-être que c'est plus facile à comprendre pour quelqu'un qui n'est pas familier avec le générateur de modèle. En passant: est-il un nom pour ce modèle?

Est-il un inconvénient dans la config de l'approche que j'ai négligé?

  • Dans le Builder votre setters besoin de return this; pour le motif travail.
  • Merci!!!! Je devrais avoir testé mon code ...
  • Avec la config approche objet, vous pouvez aussi faire des choses de type coffre-fort en employant des types fantômes. C'est-à-dire, le compilateur vous permettrait de passer de la configuration de l'instance à l'origine constructeur uniquement lorsque tous les champs nécessaires sont définies. Voir michid.wordpress.com/2008/08/13/...
InformationsquelleAutor deamon | 2010-08-03