альтернатива модели строителя - PullRequest
3 голосов
/ 01 июня 2011

Я читал о преимуществах шаблона компоновки здесь: http://drdobbs.com/java/208403883?pgno=2

Мне было интересно узнать о жизнеспособности следующего, который кажется более простым.

public class NutritionFactParams {
    private int servingSize;
    private int servings;
    private int fat_ = 0;
    private int sodium_ = 0;
    NutritionFactParams(int servingSize, int servings) {
        this.servingSize = servingSize;
        this.servings = servings;
    }
    NutritionFactParams fat(int fat) {
        this.fat_ = fat;
        return this;
    }
    NutritionFactParams sodium(int sodium) {
        this.sodium_ = sodium;
        return this;
    }
}

public class NutritionFacts {
    public NutritionFacts(NutritionFactParams params) {
        // copy values across, or store NutritionFactParams as member
    }
}

public class Main {
    public static void main(String args[]) {
        NutritionFacts n = new NutritionFacts(new NutritionFactParams(1,2).fat(23).soduim(10));
    }
}

Это в основном шаблон компоновщика, за исключением того, что конструктор NutritionFacts является публичным, а не приватным, у нас нет статического класса Builder внутри NutritionFacts, и в компоновщике нет метода build ().,Нет альтернативного конструктора или конструктора по умолчанию, поэтому вы не можете создавать NutritionFacts без предварительного создания NutritionFactsParams.

Ответы [ 2 ]

3 голосов
/ 01 июня 2011

Разница не велика, но есть одно важное различие, о котором я могу подумать:

Если вы используете компоновщик, клиентскому коду не нужно знать, какой Impl вы на самом деле возвращаете при build (), а это означает, что вы можете возвращать разные Impl в зависимости от конфигурации (компоновщик). С другой стороны, используя конструктор, клиент должен явно создать Impl.

2 голосов
/ 01 июня 2011

Шаблон компоновщика особенно полезен, когда вы хотите создавать неизменяемые объекты, но избегайте конструкторов со многими аргументами.

Шаблон, который вы используете, в основном просто плавный интерфейс . Приложения шаблона построения часто используют свободный интерфейс.

Смотри также:


Если вам не нравятся дополнительные затраты кода при использовании шаблона построителя, взгляните на make-builder .

...