具有不同初始化对象类型的Java工厂模式



我使用工厂模式创建实例,并希望用不同的对象初始化这些实例。目前我只是简单地投射对象,但这感觉不对。

public interface IGenerator {
    public IGeneratedObject generate();
}
public class FirstGenerator implements IGenerator {
    private List<FirstObject> list;
    public FirstGenerator(List<FirstObject> list) {
        this.list = list;
    }
    public IGeneratedObject generate() {
        return doSomeStuff(list);
    }
}
public class SecondGenerator implements IGenerator {
    private UnrelatedObject obj;
    public SecondGenerator(UnrelatedObject obj) {
        this.obj = obj;
    }
    public IGeneratedObject generate() {
        return doOtherThingsStuff(obj);
    }
}
public class GeneratorFactory {
    public static IGenerator createGenerator(GeneratorType type, Object object) {
        switch (type) {
        case FIRST:
            return new FirstGenerator((List<FirstObject>) object);
        case SECOND:
            return new SecondGenerator((UnrelatedObject) object);
        }
        return null;
    }
}

使用方法如下:

IGenerator gen1 = GeneratorFactory.createGenerator(GeneratorType.FIRST, listOfFirstObjects);
IGenerator gen2 = GeneratorFactory.createGenerator(GeneratorType.SECOND, unrelatedObj);

FirstObjectUnrelatedObject目前没有关联——没有公共基类或接口。

在工厂方法中,编译器当然会显示"来自…的未选中强制转换"警告

有更好的方法吗?这似乎是一种可以使用泛型的情况,但由于对象不相关,这是不可行的吗?

您能创建工厂类,使其用法如下吗?

IGenerator gen1 = GeneratorFactory.createGeneratorFirst(listOfFirstObjects);
IGenerator gen2 = GeneratorFactory.createGeneratorSecond(unrelatedObj);

没有理由使用方法"creategenerator"。

创建生成器由构造函数和类类型本身封装。

使用IGenerator gen1 = new FirstGenerator((List<FirstObject>) object);是完全可以的。

最新更新