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

时间:2015-08-07 18:01:54

标签: java factory-pattern anonymous-types

我有一个方法:

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

现在,如果我这样做:

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

它会完美地运作。但是,如果我尝试这样做:

new Foo() = FooFactory.createNewFoo();

它似乎根本不起作用。它说"变量预期"。

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

我还尝试创建一个{F}的ArrayList来做

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

它仍然表示"变量预期"。为什么这么说?

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

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

我尝试在网上搜索,但我没有搜索结果,这告诉我,我可能犯了一些荒谬的错误/使用错误的工厂模式。

3 个答案:

答案 0 :(得分:5)

等于分配 operator

targetOfMyAssignment = thingImAssigning;

new Foo()是创建对象的语句。 这是一个制片人。你不能给它分配任何东西,它不是一个变量引用。变量引用(如Foo foo =)是使用者arraylist.get(0)也是制作者。该语句,就像构造函数一样,提供一个值,但它不是您分配内容的参考。 arraylist.add(object)也是消费者

我认为你也误解了anonymous type的含义;匿名类型是指通过在{}类声明后指定新行为来覆盖部分或全部行为内嵌的类型。例如:

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

您需要一个匿名类型,因为Runnable是一个接口,没有为run()定义行为,因此Runnable r = new Runnable();将无法编译。

答案 1 :(得分:0)

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

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

其次

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

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

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

这将使用工厂方法创建的Foo对象在位置0添加对象。

答案 2 :(得分:0)

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

嗯,通常工厂会抽出实现你关心的接口的对象。在这种情况下,您不应该关心工厂泵出的具体物体类型。通过这种方式,工厂便于基于接口的编程。但我离题了。

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

其他答案可以更好地解释关于等于运算符左侧的东西需要作为参考。