2013-06-09 13 views
0

Мне нужно построить объекты класса, который имеет 3 поля: A, B и C. Допустимый объект имеет хотя бы один из A, B или C, заданный пользователем. Я заглянул в Builder Pattern, который близок к тому, что я хочу, но только 1 поле является обязательным. Я хочу это 1 поле, которое должно быть настроено на любое из 3, которое у меня есть. Какие-либо предложения?Шаблон Java для создания объекта, в котором должно быть установлено какое-либо одно поле?

Моей альтернативой является использование 7 конструкторов (для {A}, {B}, {C}, {A, B}, {B, C}, {A, C}, {A, B, C})

+1

«, но поле, которое должно быть установлено нельзя изменить »<- Я не понимаю ваше возражение? Вы можете объяснить? Шаблон-застройщик является мощным, среди прочего, потому что он может проверять такие условия, как ваш, до выполнения фактической сборки ... – fge

+1

шаблон построителя фактически позволяет вам решить, действительны ли параметры построителя, которые вы передали, до создания фактического объекта, Вот здесь проблема. Например: new Bulder(). WithA (a) .build() успешно, новый Builder(). Build() не удается –

+0

Спасибо. Я этого не знал. – ask

ответ

3

Вы можете использовать для этого. Короткий пример только два полей вместо трех:

public final class MyBuilder 
{ 
    private X a, b; 

    public MyBuilder withA(X a) 
    { 
     b = null; 
     this.a = a; 
     return this; 
    } 

    public MyBuilder withB(X b) 
    { 
     a = null; 
     this.b = b; 
     return this; 
    } 

    public MyClass build() 
    { 
     if (a == null && b == null) 
      barf(); // <-- throw exception here 
     // A and B inherit MyClass 
     return a != null ? new A(a) : new B(b); 
    } 
} 
+1

Спасибо. Я должен был дать более чем поверхностный взгляд на шаблон Builder. – ask

+0

Вы даже можете сделать лучше, чем это ... Шаблон строителя безумно мощный – fge

1

Вы можете заставить A, B или C, которые передаются в сборку() метод:

class ValidBuilder { 
    public ValidBuilder withA(Object a) {} 
    public ValidBuilder withB(Object b) {} 
    public ValidBuilder withC(Object c) {} 

    public ValidObject buildA(Object a) { } 
    public ValidObject buildB(Object b) { } 
    public ValidObject buildC(Object c) { } 
} 

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

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