Java 如何为许多具体类型创建抽象工厂
假设我们有一个名为Java 如何为许多具体类型创建抽象工厂,java,dagger-2,dagger,Java,Dagger 2,Dagger,假设我们有一个名为IAction的接口,有很多类(超过20个)实现了这个接口:ConreteAction1,ConreteAction2,等等。所有这些类都有带参数的构造函数。此外,所有这些类及其依赖项都在Dagger模块中注册(作为瞬态对象或单例)。我们的任务是实现(或自动生成)抽象工厂实现接口,类似于: public interface IActionFactory{ IAction createByClass(Class clazz); // create action by ty
IAction
的接口,有很多类(超过20个)实现了这个接口:ConreteAction1
,ConreteAction2
,等等。所有这些类都有带参数的构造函数。此外,所有这些类及其依赖项都在Dagger模块中注册(作为瞬态对象或单例)。我们的任务是实现(或自动生成)抽象工厂实现接口,类似于:
public interface IActionFactory{
IAction createByClass(Class clazz); // create action by type
// or
IAction createByName(String name); // create action by custom name
}
我知道如何使用Dagger对Provider
annotation的支持来实现此工厂:
public class ActionFactory implements IActionFactory{
@Inject Provider<ConcreteAction1> concreteAction1Provider;
@Inject Provider<ConcreteAction2> concreteAction2Provider;
(...)
@Override
public IAction createByClass(Class clazz){
if(ConcreteAction1.class.equals(clazz)){
return concreteAction1Provider.get()
}
if(ConcreteAction2.class.equals(clazz)){
return concreteAction2Provider.get()
}
(...)
}
@Override
public IAction createByName(String name){
if(name.equals("name_1")){
return concreteAction1Provider.get()
}
if(name.equals("name_2")){
return concreteAction2Provider.get()
}
(...)
}
}
公共类ActionFactory实现IActionFactory{
@注入提供者具体操作1提供者;
@注入提供者concreteAction2Provider;
(...)
@凌驾
公共IAction createByClass(课堂){
if(ConcreteAction1.class.equals(clazz)){
return-concreteAction1Provider.get()
}
if(ConcreteAction2.class.equals(clazz)){
return-concreteAction2Provider.get()
}
(...)
}
@凌驾
公共IAction createByName(字符串名称){
if(name.equals(“name_1”)){
return-concreteAction1Provider.get()
}
if(name.equals(“name_2”)){
return-concreteAction2Provider.get()
}
(...)
}
}
不幸的是,这种方法涉及大量样板代码(我有20多个具体类),每次创建IAction
接口的另一个实现时,都必须修改上面的工厂(违反了开-关原则)
Dagger中还有其他方法可以更优雅、更可扩展地创建这样的工厂实现吗?您可以使用它
@Module公共接口操作模块{
@绑定@IntoMap@ClassKey(ConcreteAction1.class)
行动1(具体行动1行动1);
@绑定@IntoMap@ClassKey(ConcreteAction2.class)
IAAction bindActionClass2(具体行动2);
// ...
@绑定@IntoMap@StringKey(“name_1”)
IAAction bindActionName1(具体行动1行动1);
@绑定@IntoMap@StringKey(“name_2”)
IAAction bindActionName2(具体行动2行动2);
// ...
}
公共类ActionFactory实现IActionFactory{
@注入映射