1

我正在创建一个 abstractFactory 类,我希望能够将具体工厂作为参数发送。这样我就可以删除抽象类中的 if/else 链。

我的问题是我不确定如何将其类型转换回我的抽象类中的具体类以调用 createVehicle() 方法。

car = UniversalVehicleFactory.getFactory().createVehicle(CarFactory);
plane = UniversalVehicleFactory.getFactory().createVehicle(PlaneFactory);

在 UniversalVehicleFactory 我有方法 createVehicle 这是我遇到问题的方法。我想要实现的是:获取参数,确定其类并将其转换为该类,然后调用其内部 createVehicle 类。

public Vehicle createVehicle(AbstractFactory factory) {

    // I want to take factory,
            // cast it to the concrete factory, and
            // call createMethod() on the factory 

    return factory.getInstance().createVehicle();       
}

非常感谢帮助解决这个问题!

4

3 回答 3

3

我会回答你的问题,但我很好奇为什么你想要一个通用工厂来调用抽象工厂的方法,如果你确实必须提供该工厂的一个实例作为参数;你最好直接调用抽象工厂的创建方法。

为此目的发明了泛型。

interface Factory< T > {
    T make();
}

public class CarFactory implements Factory< Car > {
    Car make() { ... }
}

public class PlaneFactory implements Factory< Plane > {
    Plane make() { ... }
}

public class UniversalVehicleFactory {
    public < T extends Vehicle > T make( Factory< T > factory ) {
        return factory.make();
    }
}

您会注意到 UniversalVehicleFactory 没有实现 Factory< T >。

于 2012-06-17T08:13:14.250 回答
1

我认为您正在尝试在这里应用抽象工厂模式。这是我的解决方案:

你可以有接口VehicleFactory和工厂类:

interface VehicleFactory {
    Vehicle createVehicle();
}

class CarFactory implements VehicleFactory {
    public Vehicle createVehicle() {
        return new Car();
    }
}

class PlaneFactory implements VehicleFactory {
    public Vehicle createVehicle() {
        return new Plane();
    }
}

然后,如果你想集中所有工厂,你可以有一个UniversalVehicleFactory

class UniversalVehicleFactory {

    private Map<Class<T extends VehicleFactory>, VehicleFactory> factories;

    static {
        factories = new HashMap<Class<T extends VehicleFactory>, VehicleFactory>();
        factories.put(CarFactory.class, new CarFactory());
        factories.put(PlaneFactory.class, new PlaneFactory());
    }

    public static VehicleFactory getFactory(Class<T extends VehicleFactory> factoryClass) {
        return factories.get(factoryClass);
    }

}

然后在您的代码中,使用可以像这样使用它:

Vehicle car = UniversalVehicleFactory.getFactory(CarFactory.class).createVehicle();
Vehicle plane = UniversalVehicleFactory.getFactory(PlaneFactory.class).createVehicle();
于 2012-06-17T08:10:51.913 回答
0

以下是一些通用代码,可能会对您有所帮助:

public class A 
{
    public void paint(Graphics g)
    {

    }
}

public class B extends A
{
    public static void main(String args[])
    {
        A a = new A();
        B b = new B();

        // This is the only one that won't work, because a is not an instance of b.
        if(a instanceof B)
            ((B)a).draw(new Graphics()); 

        if(b instanceof B)
            ((B)b).draw(new Graphcis());

        if(a instanceof A)
            ((A)a).paint(new Graphics());

        if(b instanceof A)
            ((A)b).paint(new Graphics());
    }

    public void draw(Graphics g)
    {

    }
}

instanceof是在类型转换之前使用以避免错误的好工具。我希望这会有所帮助,如果它太笼统并且您希望我将其更多地应用于您的情况,请告诉我。

于 2012-06-17T07:54:35.007 回答