我有一个与A一起使用的类List<String>。但是此类之外的任何人都不需要知道它可以与字符串一起使用。但是,我也想提供该类List应该使用的具体实现(通过依赖注入)。

A应该看起来像这样

public class A {
  private ListFactory listFactory; //this gets injected from the outside

  public A(ListFactory listFactory) {
    this.listFactory = listFactory;
  }

  public void a() {
    List<String> = listFactory.createList();
    //...
  }
}


呼叫者类B像这样

public class B {
  public void b() {
    ListFactory factory = new ArrayListFactory(); //we want class A to use ArrayList
    A a = new A(factory);
    //...
  }
}


ListFactory是由ArrayListFactory实施以创建ArrayList的接口。

精髓:
我不希望B在某处提到String。而且我也不希望A在某处提到ArrayList

这可能吗? ListFactoryArrayListFactory的外观如何?

最佳答案

我认为这比您做的要简单:

public interface Factory {
    public <T> List<T> create();
}

public class FactoryImpl implements Factory {
    public <T> ArrayList<T> create() {
        return new ArrayList<T>();
    }
}

...
Factory f = new FactoryImpl();
List<String> strings = f.create();
...

10-06 13:17