Может ли фабрика объектов Java использоваться в качестве конструктора? - PullRequest
0 голосов
/ 06 октября 2018

Я довольно новичок в Java, так что, надеюсь, этот вопрос не слишком глуп.

Согласно документации Java: «Фабрика объектов - это производитель объектов. Она принимает некоторую информацию о том, как создаватьобъект, такой как ссылка, а затем возвращает экземпляр этого объекта. "

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

Вот некоторый (абсолютно бессмысленный) пример кодаэто иллюстрирует иерархию классов, которую я пытаюсь построить (вызов ее с помощью простых целочисленных аргументов, таких как «1 2 3», поможет понять):

package number;

public class Factory {
    public static void main(String[] args) {
        for (String arg : args) {
            // This is how I want to instantiate and use the Outer class:
            Outer outer = new Outer(arg);
            // But I don't know how to create Outer from the factory, and the results are wrong:
            System.out.println("yields: " + outer.value + ", class: " + outer.Class());
            // This is a workaround (that I can't use) that gives the correct results:
            Number number = outer.Workaround(arg);
            System.out.println("yields: " + number.value + ", class " + number.Class());
        }
    }
}

class Outer extends Inner {
    Outer(String arg) {
        super(arg);
    }
}

class Inner extends Number {
    Inner(String arg) {
        // I don't want to do this:
        super(arg);
        // I want some way of doing this:
        // return NumberFactory.getNumber(arg);
    }
    // Workaround method that I can't really use:
    Number Workaround(String arg) {
        return NumberFactory.getNumber(arg);
    }
}

class NumberFactory {
    static Number getNumber(String selection) {
        switch (selection) {
            case "1":  return new First(selection);
            case "2":  return new Second(selection);
            default:   return new Other(selection);
        }
    }
}

class First extends Number {
    First(String arg) { super(arg);  value = "first"; }
    String Class() { return "First"; }
}

class Second extends Number {
    Second(String arg) { super(arg);  value = "second"; }
    String Class() { return "Second"; }
}

class Other extends Number {
    Other(String arg) { super(arg);  value = "other"; }
    String Class() { return "Other"; }
}

class Number {
    String arg;
    String value = "default";
    Number(String arg) {
        this.arg = arg;
        System.out.print("Number(" + arg + "), ");
    }
    String Class() { return "Number"; }
}

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

пожалуйста, объясните, что вы пытаетесь сделать.

но вот моя попытка ответить на ваш вопрос.

Конструктор используется при создании нового объекта Java.При использовании new SomeObject() компилятор использует конструктор

SomeObject(){ 
    // some logic here
}

для создания объекта с использованием SomeObject.class.Как объект создается и поддерживается в течение его жизненного цикла, зависит от JVM.Вы можете найти больше информации здесь.https://en.wikibooks.org/wiki/Java_Programming/Object_Lifecycle

Также фабрики объектов используются для создания объектов, но в свою очередь они используют конструкторы объектов для создания экземпляров объекта внутри них (как вы уже сделали это).Фабрики объектов используются для делегирования логики создания объектов в центральном месте, так что код не повторяется и хорошо организован.Узнайте больше об объектных фабриках здесь https://github.com/iluwatar/java-design-patterns/tree/master/abstract-factory

еще одна вещь, которую вам не нужно реализовывать String Class() метод внутри каждого реализуемого вами класса.SomeObject.class.toString() сделает это за вас.

0 голосов
/ 06 октября 2018

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

Конструкторы в java - это способ общения с классом, даже если вы не определяете конструктор класса, конструктор по умолчанию со значениями по умолчанию (т. Е. False для логического значения и т. Д.) Создается для вашего класса с помощьюкомпилятор ..... Итак, я думаю, когда вам нужен конкретный способ создания соединения с вашим классом, вы создаете определенные конструкторы, иначе компилятор всегда делает доступным значение по умолчанию.

Возможно, вы захотите спроситьпочему мы должны использовать super () перед чем-либо в конструкторе подкласса, и причина этого опять та же, т. е. конструктор родительского класса должен быть вызван перед конструктором подкласса.Это гарантирует, что если вы вызовете какие-либо методы родительского класса в своем конструкторе, родительский класс уже настроен правильно.

...