如何在工厂模式中使用匿名对象?

How do you use anonymous objects with the factory pattern?

我有这样的方法:

public class FooFactory {
    public Foo createNewFoo(){
        return new foo();
    }
}

现在如果我这样做:

FooFactory fooFactory = new FooFactory();
Foo foo = FooFactory.createNewFoo();

它会很好地工作。但是,如果我尝试这样做:

new Foo() = FooFactory.createNewFoo();

它似乎根本不起作用。它说 "variable expected".

我明白 new Foo() 本身会创建一个新的 Foo 对象,但即使我使用工厂,它也应该只是用一个新的 Foo 对象覆盖匿名对象。

我也试过创建一个 ArrayList 来保存 Foo 并做

arrayList.add(new Foo());
arrayList.get(0) = FooFactory.createNewFoo();

它仍然说 "variable expected"。为什么这么说?

Foo foo = new Foo();
Foo otherFoo = foo;

这工作得很好,所以我不明白为什么我不能让工厂使用匿名对象。

我试着在网上搜索这个,但没有搜索到结果,这告诉我我可能把一些可笑的mistake/using工厂模式弄错了。

等于是一个赋值operator

targetOfMyAssignment = thingImAssigning;

new Foo() 是创建对象的语句。 是生产者。你不能给它赋值,它不是变量引用。变量引用,如 Foo foo =,是 消费者arraylist.get(0) 也是 生产者 。该语句,就像构造函数一样,提供一个值,但它不是供您赋值的参考。 arraylist.add(object) 也是 消费者


我想你也误解了anonymous type是什么;匿名类型是您通过在 class 声明 {} 之后指定新行为来覆盖其部分或全部行为 内联 的类型。例如:

Runnable r = new Runnable() {
  public void run() {
    // code
  }
};

您需要一个匿名类型,因为 Runnable 是一个接口,没有为 run() 定义的行为,所以 Runnable r = new Runnable(); 不会编译。

你在这里 Java 错了。 为了创建和保存一个对象,您需要一个引用(在您的左侧)和一个将生成您的对象的命令(在您的右侧)。您可以通过 new 关键字或方法调用(可以是工厂方法)来执行此操作。

Foo f1 = new Foo();
Foo f2 = FooFactory.createNewFoo();

其次

arrayList.get(0) = FooFactory.createNewFoo();

是错误的,因为你正在检索一个对象,而不是一个引用,然后你想将一个对象分配给一个对象,而不是一个引用。

arrayList.add(0, FooFactory.createNewFoo()); 

这将在位置 0 添加对象,其中包含工厂方法创建的 Foo 对象。

工厂模式通常涉及 static 创建方法。这意味着在较高级别上,create 方法并不特定于单个工厂对象实例,而是在 class 本身的上下文中调用。相反,工厂会输出您希望它创建的类型的实例对象。

嗯,通常工厂会抽出实现您关心的接口的对象。在那种情况下,您不应该关心工厂生产的具体对象类型。通过这种方式,工厂促进了基于接口的编程。但是我跑题了。

最重要的是,如果您在 class 上调用静态方法,则不需要先实例化该 class 类型的对象。

关于需要作为参考的等号运算符左侧的内容在其他答案中得到了更好的解释。