在必须创建底层对象的实例时使用接口注入
Using interface injection while having to create instances of the underlying object
我有一个接口来表示具有竞争实现的数据结构。我需要在 class 中使用它,同时将 class 从必须知道底层数据结构中分离出来。在这个 class 中,我需要创建这个实现的多个实例。如何使用接口注入来做到这一点?
class Foo {
Map<String, IDataStructure> map = new HashMap<String, IDataStructure>();
public void addValue(String key, String value) {
if(!map.containsKey(key)) {
map.put(key, new SomeDataStructure(value));
}
}
}
编辑
我找到了一种使用接口注入的方法。创建工厂接口
class ADataStructureFactory implements DataStructureFactory {
IDataStructure create() {
return new SomeDataStructure();
}
}
并在构造函数中注入这个
Foo(DataStuctureFactory factory)
更改添加方式
public void addValue(String key, String value) {
if(!map.containsKey(key)) {
map.put(key, factory.create());
}
}
这是你能做的:
在 IDataStructure 中定义一个添加方法:
public interface IDataStructure {
public void add(String value);
}
创建一个名为 ListDataStructure 的 IDataStructure 实现,如下所示:
public class ListDataStructure implements IDataStructure {
private List<String> dataStructure = new ArrayList<String>();
@Override
public void add(String value) {
dataStructure.add(value);
}
}
创建名为 SetDataStructure 的 IDataStructure 实现
public class SetDataStructure implements IDataStructure {
private Set<String> dataStructure = new HashSet<String>();
@Override
public void add(String value) {
dataStructure.add(value);
}
}
修改你的 Foo class 如下:
class Foo {
private Map<String, IDataStructure> map;
public Foo(Map<String,IDataStructure> map) {
this.map = map;
}
public void addValue(String key, String value) {
if(map.containsKey(key)) {
map.get(key).add(value);
} else {
/*handle what happens when data structure does not exist. Maybe thow an exception
}
}
}
如何注入支持的数据结构的示例。请注意,您不能即时定义数据结构。您需要使用支持的数据结构实现在 Foo 中预填充地图。
public class DataStructureExample {
public static void main(String []args) {
Map<String,IDataStructure> dataStrucures = new HashMap<String,IDataStructure>();
//injecting different data structures into Foo
dataStrucures.put("List", new ListDataStructure());
dataStrucures.put("Set", new SetDataStructure());
Foo foo = new Foo(dataStrucures);
//add some value to a list data structure
foo.addValue("List", "Value1");
//add some valu to a set data structure
foo.addValue("Set", "Value1");
}
}
我找到了一种使用接口注入的方法。创建一个抽象工厂。
class ADataStructureFactory implements DataStructureFactory {
IDataStructure create() {
return new SomeDataStructure();
}
}
并在构造函数中注入这个
Foo(DataStuctureFactory factory)
更改添加方式
public void addValue(String key, String value) {
if(!map.containsKey(key)) {
map.put(key, factory.create());
}
}
我有一个接口来表示具有竞争实现的数据结构。我需要在 class 中使用它,同时将 class 从必须知道底层数据结构中分离出来。在这个 class 中,我需要创建这个实现的多个实例。如何使用接口注入来做到这一点?
class Foo {
Map<String, IDataStructure> map = new HashMap<String, IDataStructure>();
public void addValue(String key, String value) {
if(!map.containsKey(key)) {
map.put(key, new SomeDataStructure(value));
}
}
}
编辑
我找到了一种使用接口注入的方法。创建工厂接口
class ADataStructureFactory implements DataStructureFactory {
IDataStructure create() {
return new SomeDataStructure();
}
}
并在构造函数中注入这个
Foo(DataStuctureFactory factory)
更改添加方式
public void addValue(String key, String value) {
if(!map.containsKey(key)) {
map.put(key, factory.create());
}
}
这是你能做的:
在 IDataStructure 中定义一个添加方法:
public interface IDataStructure {
public void add(String value);
}
创建一个名为 ListDataStructure 的 IDataStructure 实现,如下所示:
public class ListDataStructure implements IDataStructure {
private List<String> dataStructure = new ArrayList<String>();
@Override
public void add(String value) {
dataStructure.add(value);
}
}
创建名为 SetDataStructure 的 IDataStructure 实现
public class SetDataStructure implements IDataStructure {
private Set<String> dataStructure = new HashSet<String>();
@Override
public void add(String value) {
dataStructure.add(value);
}
}
修改你的 Foo class 如下:
class Foo {
private Map<String, IDataStructure> map;
public Foo(Map<String,IDataStructure> map) {
this.map = map;
}
public void addValue(String key, String value) {
if(map.containsKey(key)) {
map.get(key).add(value);
} else {
/*handle what happens when data structure does not exist. Maybe thow an exception
}
}
}
如何注入支持的数据结构的示例。请注意,您不能即时定义数据结构。您需要使用支持的数据结构实现在 Foo 中预填充地图。
public class DataStructureExample {
public static void main(String []args) {
Map<String,IDataStructure> dataStrucures = new HashMap<String,IDataStructure>();
//injecting different data structures into Foo
dataStrucures.put("List", new ListDataStructure());
dataStrucures.put("Set", new SetDataStructure());
Foo foo = new Foo(dataStrucures);
//add some value to a list data structure
foo.addValue("List", "Value1");
//add some valu to a set data structure
foo.addValue("Set", "Value1");
}
}
我找到了一种使用接口注入的方法。创建一个抽象工厂。
class ADataStructureFactory implements DataStructureFactory {
IDataStructure create() {
return new SomeDataStructure();
}
}
并在构造函数中注入这个
Foo(DataStuctureFactory factory)
更改添加方式
public void addValue(String key, String value) {
if(!map.containsKey(key)) {
map.put(key, factory.create());
}
}