将工厂模式转换为Guice模块

时间:2016-11-28 09:06:03

标签: java dependency-injection guice

我有以下工厂

public class AppleFactory<T extends Fruit>
    extends AbstractAppleFactory<Class<T>, TypeOfFruits, Fruits<T>>
{
    private static final AppleFactory factroy = new AppleFactory();

    private AppleFactory()
    {
    }

    public static Fruits<? extends Fruit> get(Class<? extends Fruit> clazz,
        TypeOfFruits typeOfFruits)
    {
        return (Fruits<? extends Fruit>) factroy.getInstance(clazz, typeOfFruits);
    }

    @Override
    protected Fruits<T> newInstance(Class<T> clazz, TypeOfFruits typeOfFruits)
    {
        final Fruits<T> fruits;
        fruits = new FruitsImpl<T>(clazz, typeOfFruits,"hello");
        return fruits;
    }
}

我试图通过这样做将其转换为Guice模块模式:

@ImplementedBy(AppleFactoryImpl.class)
public interface AppleFactory<T extends Fruit>
{
    Fruits<? extends Fruit> get(Class<? extends Fruit> clazz,
        TypeOfFruits typeOfFruits)
}

@Singleton
public class AppleFactoryImpl implements AppleFactory
{
    @Override
    public Fruits<? extends Fruit> get(Class<? extends Fruit> clazz,
        TypeOfFruits typeOfFruits)
    {
        final Fruits<T> fruits;
        fruits = new FruitsImpl<T>(clazz, typeOfFruits,"hello");
        return fruits;
    }
}

但是我在实现中遇到错误。它说它不能解决水果的T型。

我的最终目标是通过这个工厂实现不同的实现,即绑定

  

FruitFactory,FruitFactory

具体实施。

这可以改为使用提供商或其他任何东西,我对方法不太严格

有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

在你所写的内容中,没有从通用到具体的移动。您希望最终通过具体结果解决您的泛型类型,对吧?我想知道你的目标是否可以通过以下方式实现:

通用界面:

    public interface FruitFactory<T extends Fruit> {
        T get();
    }

具体实施:

    public class AppleFactory implements FruitFactory<Apple> {

        @Override
        public Apple get() {
            return new Apple("apple");
        }
    }

    public class OrangeFactory implements FruitFactory<Orange> {

        @Override
        public Orange get() {
            return new Orange("orange");
        }
    }

最后是一个像这样绑定他们的模块:

public class FruitFactoryModule implements Module {

        @Override
        public void configure(Binder binder) {
            binder.bind(new TypeLiteral<FruitFactory<Apple>>() {}).to(AppleFactory.class);
            binder.bind(new TypeLiteral<FruitFactory<Orange>>() {}).to(OrangeFactory.class);
        }
    }
}