Java对象工厂可以用作构造函数吗?

时间:2018-10-06 02:25:27

标签: java constructor factory

我对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 :(得分:0)

我无法理解您的主要问题,因为java对象工厂是java的业务,尽管我们可以尝试回答您有关实例和构造函数的问题,但我认为我们无法用它做任何事情。 >

Java中的构造函数是您与类对话的方式,即使您未定义类的构造函数,也将为您的类创建具有默认值(即,对于boolean等为false)的默认构造函数。编译器.....所以,我想,当您想使用特定的方式与您的类创建连接时,您需要使用特定的构造函数,否则编译器始终会提供默认值。

也许你想问为什么我们必须在子类构造函数中的任何东西之前使用super(),其原因再次相同,即父类的构造函数需要在子类的构造函数之前调用。这将确保如果您在构造函数中的父类上调用任何方法,则该父类已经正确设置。

答案 1 :(得分:0)

请说明您要做什么。

但这是我试图回答您的问题。

构造器在创建新的Java对象时使用。当您使用SomeObject(){ // some logic here } 时,编译器将使用构造器

String Class()

使用SomeObject.class创建对象。在整个生命周期中如何创建和维护对象取决于JVM。您可以在此处找到更多信息。 https://en.wikibooks.org/wiki/Java_Programming/Object_Lifecycle

对象工厂也用于创建对象,但是它们又使用对象构造函数来实例化对象内部的对象(如您已经做的那样)。 对象工厂用于将对象创建的逻辑委派到一个中心位置,从而使代码不会重复且组织良好。 在https://github.com/iluwatar/java-design-patterns/tree/master/abstract-factory

上了解有关对象工厂的更多信息。

您不必在实现的每个类中实现SomeObject.class.toString()方法。 operator <<会为您做到这一点。