Рефакторинг для использования шаблона Builder или шаблона Telescoping constructor - PullRequest
10 голосов
/ 09 апреля 2011

Согласно Effective Java 2ed Элемент 2

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

Пример конструкторов класса, применяющих этот шаблон, заимствован из Когда вы будете использовать шаблон Builder?

кодовый набор 1a

Pizza(int size) { ... }        
Pizza(int size, boolean cheese) { ... }    
Pizza(int size, boolean cheese, boolean pepperoni) { ... }    
Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon) { ... }

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

набор кодов 1b

Pizza(int size) { ... }        
Pizza(int size, boolean cheese) { ... }    
Pizza(int size, boolean pepperoni) { ... }    
Pizza(int size, boolean cheese, boolean pepperoni, boolean bacon, int price, int) { ... }

Другой пример - это код

набор 2

public AttributeKey(String key, Class<T> clazz)
public AttributeKey(String key, Class<T> clazz) 
public AttributeKey(String key, Class<T> clazz, @Nullable T defaultValue, boolean isNullValueAllowed)
public AttributeKey(String key, Class<T> clazz, @Nullable T defaultValue, boolean isNullValueAllowed, @Nullable ResourceBundleUtil labels)

Два последних примера , которые я дал , не соответствовали характеристикам телескопического конструктора , поскольку кодовый набор 1a сделал

  1. Включены ли кодовые наборы 1b и 2 в конструктор телескопирования?если нет, то как это называется?
  2. По сравнению с использованием Pattern Builder, который (между Builder и шаблоном кодового набора 1a, 2) обеспечивает больше преимуществ

Ответы [ 2 ]

2 голосов
/ 09 апреля 2011

Как называется этот шаблон параметров конструкторов?

Это не шаблон проектирования как таковой, но это метод программирования, называемый конструкторской цепочкой.

По сравнению с использованием Builder Pattern, который дает больше преимуществ

Тот же самый вопрос SO: Когда бы вы использовали шаблон Builder? , который вы позаимствовали, также хорошо объясняет разницу. Короче говоря, конструктор предпочтительнее цепочки конструкторов, поскольку это может привести к увеличению числа конструкторов, которые могут стать трудными для обслуживания.

Надеюсь, это поможет.

1 голос
/ 09 апреля 2011

В этом случае я бы выбрал либо компоновщик, либо другой механизм, в котором вызывающая сторона может передать набор начинки.Если вам нужно проверить, какие начинки разрешены, это можно сделать в конструкторе или в установщике Toppings.Подход конструктора телескопирования / сцепления может потребовать от вас добавления дополнительных конструкторов в будущем для обработки дополнительных комбинаций начинки, тогда как подход сбора данных будет обрабатывать любой сценарий автоматически.Я также избегал бы иметь определенные свойства в классе пиццы для различных типов начинки.Что делать, если вам нужно обработать лишний сыр?Один логический cheese не справится с этим.Класс Topping может быть полноценным объектом с подклассами, или вы можете заменить его просто строкой.

public class Pizza
{
    // setters don't have to be private...
    public int Size {get; private set;}
    private List<Topping> toppings {get; private set;}

    public Pizza(int size) : this(size, new List<Topping>()) // call the other ctor with an empty list of toppings
    {
    }

    public Pizza(int size, List<Topping> toppings)
    {
        Size = size;
        Toppings = toppings;
    }
}
...