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

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

public class Parent {

private int x;

public Parent(int x) {this.x = x;}

public int getX() {return x;}

public void setX(int x) {this.x = x;}
}

Первый ребенок

public class FirstChild extends Parent {

private int y;

public FirstChild(int x, int y) {
    super(x);
    this.y = y;
}

public int getY() {
    return y;
}

public void setY(int y) {
    this.y = y;
}
}

Второй ребенок

public class SecondChild extends Parent{
private int z;

public SecondChild(int x, int z) {
    super(x);
    this.z = z;
}

public int getZ() {
    return z;
}

public void setZ(int z) {
    this.z = z;
}
}

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

2
nl ja de

3 ответы

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

В этом случае вы можете использовать отражение или elipsis:

class MyFactory {
    Parent createInstance(Class clazz, int ... args) {
        if (FirstChild.class.equals(clazz)) {
            return new FirstChild(args[0]);
        }
        if (SecondChild.class.equals(clazz)) {
            return new SecondChild(args[0], args[1]);
        }
        throw new IllegalArgumentException(clazz.getName());
    }
}
2
добавлено
interface Factory {
    Parent newParent();
} 

class FirstFactory implements Factory {
    Parent newParent() { return new FirstChild(); }
}

class SecondFactory implements Factory {
    Parent newParent() { return new SecondChild(); }
}


class Client {
    public void doSomething() {
        Factory f = ...;//get the factory you need 
        Parent p = f.newParent();
        use(p)
    } 

   //or more appropriately
    public void doSomethingElse(Factory f) {
        Parent p = f.newParent();
        use(p)
    }

}

// Or...

abstract class Client {
    public void doSomething() {
        Factory f = getFactory();
        Parent p = f.newParent();
        use(p)
    } 
    abstract Factory getFactory(); 
}

class FirstClient extends Client {
    Factory getFactory() {
        return new FirstFactory();
    } 
}

class SecondClient extends Client {
    Factory getFactory() {
        return new SecondFactory();
    } 
}

Или (возможно, лучше подходит, что вам нужно):

public class ChildrenFactory {
    FirstChild newFistChild() { return new FirstChild(); } 
    SecondChild newSecondChild() { return new SecondChild(); } 
   //or
    Parent newFistChild() { return new FirstChild(); } 
    Parent newSecondChild() { return new SecondChild(); } 
}

Вероятно, вам действительно не нужно использовать интерфейс Parent .

1
добавлено

У вас может быть заводский класс, который генерирует либо первый ребенок, либо второй ребенок, как показано ниже

class Factory{
   Parent createChild(String child) {
      if(child.equals("first"))
         return new FirstChild();
      if(child.equals("second"))
         return new SecondChild();


   }
}

Also this link below will help you understand factory pattern better http://www.hiteshagrawal.com/java/factory-design-pattern-in-java

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async