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



我对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"; }
}

请解释一下您要做什么。

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

每当创建新的 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()会为你做这件事。

我无法理解您的主要问题,因为 java 对象工厂是 java 的业务,我认为我们对此无能为力,尽管我可以尝试回答您关于实例和构造函数的问题.....

java 中的构造函数是你与类交谈的方式,即使你没有定义类的构造函数,编译器也会为你的类创建一个具有默认值的默认构造函数(即布尔值等为 false 等(。所以,我想当你想要与你的类建立连接的特定方式时,你制作特定的构造函数,否则编译器总是提供默认值。

也许你想问为什么我们必须在子类构造函数中的任何内容之前使用 super((,其原因再次相同,即父类的构造函数需要在子类的构造函数之前调用。这将确保在构造函数中对父类调用任何方法时,父类已正确设置。

最新更新