2017-01-17 21 views
1

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

public class Foo { 
    public Type; 
    public int planeId; 
    public int carId; 
    public int capacity; 
    public String manufacturer; 
    public int serialId; 
    .. etc 
} 

Теперь Type это перечисление, с САМОЛЕТ и ЦАР как 2 значения. Условие заключается в том, что если Type является плоской, то planeId необходимо заполнить, иначе CarId нужно заселить. Поскольку class Foo имеет много параметров, мы выбрали шаблон строителя.

public static class Builder { 

    public Builder(public Type type, int id) { 
     if (type == PLANE) { 
      planeId = id; 
     } else { 
      carId = id; 
     } 
    } 

Но тогда у меня была идея, чтобы расплавить статические заводы в строитель шаблон

public static class Builder { 

    public static Builder getPlaneBuilder(int id) { 
    return new Builder(PLANETYPE, id); // calls private constructor 

    } 

    public static Builder getCarBuilder(int id) { 
    return new Builder(CARTYPE, id); // calls private constructor 
} 

Я никогда не видел статические заводы, слитые в строителей, но они, кажется, делают свою работу хорошо. Любые комментарии ? Критики? лучшее решение?

+0

Вы только что написали это как пример? Я не думаю, что какие-либо из этих заявлений в вашем втором примере будут скомпилированы. Java не имеет инициализаторов объектов. – Moira

+1

Да, я набрал, но вроде фиксированный. – JavaDeveloper

ответ

1

Условие заключается в том, что если тип плоский, то planeId должен быть населенным, иначе CarId должен быть заполнен.

Если carId для Car объекта и planeId для Plane объекта, вы должны не иметь два различных класса для обработки их и объявить эти поля только там, где они необходимы? Добавление полей в оба класса, которые имеют отношение только к одному классу, вероятно, нежелательно. Это уменьшает сцепление полей класса.

О вашем вопросе, используя заводской метод, конечно, хорошая идея. Обычно полезно, когда вы хотите контролировать создание экземпляра (для вас это уже имеет место с создателем).
Но это также полезно, когда у вас есть несколько способов построения объекта и что конструктор не передает достаточную информацию о том, что вы хотите создать.

Например, это хороший пример:

public static Builder getPlaneBuilder(int id) { 
    return new Builder(PLANETYPE, int id); // calls private constructor 
    } 

Из кода клиента getPlaneBuilder(int id) является более значимым, чем public Builder(public Type type, int id).

 Смежные вопросы

  • Нет связанных вопросов^_^