Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为许多具体类型创建抽象工厂_Java_Dagger 2_Dagger - Fatal编程技术网

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{
@注入映射