2016-04-19 6 views
0

Я изучаю с использованием шаблона проектирования Builder для создания подклассов родительского объекта, основанного исключительно на общем типе подкласса. Эта фраза является своим родом запутанной, вот что я имею в виду:Создайте подкласс с использованием родительского генератора Builder

public class Animal(){ 
    private String name; 
    private String gender; 

    public Animal(Builder<?> builder){ 
     this.name = builder.name; 
     this.gender = builder.gender; 
    } 

    public static Builder<T extends Animal>{ 
     private String name; 
     private String gender; 

     public Builder<T> setName(String name){ 
      this.name = name; 
      return this; 
     } 

     public Builder<T> setGender(String gender){ 
      this.gender = gender; 
      return this; 
     }   

     public T build(Class<T> clazz){ 
      try { 
       Constructor<T> c = clazz.getDeclaredConstructor(Builder.class); 
       c.setAccessible(true); 
       return c.newInstance(this); 
      }catch (Exception e){ 
       e.printStackTrace(); 
      } 

      return null; 
     } 
    } 
} 

Кроме этого, это заканчивается тем, что, скорее подвержены ошибкам и «хак». Я хочу иметь один Builder, который создает все подклассы.

Вопрос

Есть ли лучший способ сделать это? Возможно, шаблон дизайна Builder просто не подходит для моих нужд. Это работает, но не кажется правильным.

ПРИМЕЧАНИЕ. Истинные потребности этого вопроса не такие тривиальные, как пример класса животных. Вы можете себе представить, что я пытаюсь создать подкласс для родительского класса, который содержит много аргументов. Использование шаблона построителя сделает это намного проще для создания экземпляров и будет легче распространяться на будущие подклассы.

Подклассы объектов будут иметь свои собственные методы ТОЛЬКО. Никаких дополнительных полей, только методы, строго определенные для их типа подкласса.

I.e. Утка является подклассом птицы, и она крякает. Эму является подклассом птицы, но я не хочу, чтобы она была в шарлатанстве, она будет работать только. Но я хочу, чтобы у них было имя и пол.

+0

Кто-то оставил комментарий относительно того, почему я это здесь, а не в проверке кода. Причина в том, что это подлинный вопрос StackOverflow ... Я представил код, который я пробовал, но знаю, что это не чистое решение Java. Я хотел, чтобы кто-то помог мне получить лучший ответ, используя мой примерный код, как отправную точку для создания и отображения. – rosenthal

ответ

2

Вместо того, чтобы указать класс Animal, у каждого подкласса Animal есть свой собственный Builder, который может построить этот Animal.

То есть:

public abstract class Animal { 
    protected Animal(Builder<?> builder) { ... } 

    public abstract static class Builder<T extends Animal> { 
    // setters for fields common to all animals go here 

    public abstract T build(); 
    } 
} 

public final class Dog extends Animal { 
    private Dog(Builder builder) { 
    super(builder); 
    } 

    public static final class Builder extends Animal.Builder<Dog> { 
    @Override 
    public Dog build() { 
     return new Dog(this); 
    } 
    } 
} 
+0

Это то, что я только что пробовал, прежде чем читать ваш ответ. Мне он до сих пор нравится – rosenthal