我对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"; }
}
答案 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 <<
会为您做到这一点。