2016-02-12 102 views
1

我们假设我有一个包装foo与几个类; Foo1, Foo2, Foo3。他们都实现了IFoo,它有一种方法。现在,我有另一个课程,Baz,它们使用所有这些类。基本上baz需要调用每个IFoo类的方法。动态创建对象的正确Java方法是什么?

注:

  • 它们可以被重复使用。意思是,我们只需要创建一次。
  • 某天我可能想添加Foo4

现在,我能想到是创建一个单身,FooSingleton它封装了所有这些类和加载它们的:

  1. 读文件。
  2. 反射
  3. 只写了new Foo1();new Foo2();等,在单例的init函数内。

所以我想知道什么是最好的方式(也许还有另一种巧妙的方法我还没有想到的)

顺便说一句,我遇到了Spring Dependency Injection但看着我一点点的开销。

+2

我只想叫'新Foo1()'当你需要'Foo1',除非是有原因的,使之更加复杂whihc是我也不清楚。 –

+0

使用Spring,有一种非常自然的方式来做到这一点。如果没有,'春'的方式是扫描实现IFoo的类的类路径,将它们实例化为单例(反射),并允许您在发现的每个事件中调用IFoo中的方法。如果您有一天添加了新的Foo4,您的框架会自动检测并使用它。 –

+0

@PeterLawrey,'baz'需要他们所有人。基本上'baz'是一个'Runnable',对于每个'run()'它调用每个'IFoo'类的这个方法。 – Elimination

回答

1

你可以使用一个依赖注入框架:它将允许你有单身人士为IFoo的实例。

你也可以这样做

FooPool { 

    private List<IFoo> foos; 

    FooPool() { 
     foos.add(Foo1.getInstance()); 
     foos.add(Foo2.getInstance()); 
     foos.add(Foo3.getInstance()); 
    } 

    public List<IFoo> getFoos() { 
     return foos 
    } 
} 

IFoo实施将是单身。你也可以将FoolPool也作为单例。

1

您的问题可以通过应用工厂模式来解决。

用可以是Bean或静态的FooFactory类替换您的单例。方法getFoo(?)将包含返回正确对象的逻辑。


编辑:根据您的评论添加另一个建议。

创建一个侦听器,其中所有IFoo实现将在实例化时注册。到时候,Baz会在列表中运行并调用在监听器中注册的每个IFoo的方法。

+0

但是再次,我需要做一些事情:'FooFactory.create(“foo1”)' – Elimination

+0

或者使用'Enum'而不是'String'。总之,有人需要迭代这个枚举/字符串列表。 – Elimination

+0

在所有Foos中选择什么逻辑? –

1

每次运行()调用每一个IFoo的类

我用enum为战略类,那里是每个战略

interface IFoo { 
    void doSomething(); 
} 

enum Foos implements IFoo { 
    FOO1 { 
    public void doSomething() { 

    } 
    }, 
    FOO2 { 
    public void doSomething() { 

    } 
    }, 
    FOO3 { 
    public void doSomething() { 

    } 
    } 

}

一个实例的这种方法

给所有实例打电话doSomething

for (IFoo foo : Foos.values()) { 
    foo.doSomething(); 
} 

这里是我用过这个的一个例子。

https://github.com/OpenHFT/Chronicle-Wire/blob/master/src/main/java/net/openhft/chronicle/wire/WireType.java

+0

非常整齐!我不知道这样的事情可以做 – Elimination

+1

@Elimination当我想在单元测试中测试所有可能的实现时,我在循环中使用值, –

+1

@Elimination你不能为一个枚举子类化,但你可以有更多的而不是一个枚举实现相同的接口并收集这些实现。 –

相关问题