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

ここで Abstract Factory パターンを適用しようとしていると思います。これが私の解決策です:

インターフェイス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 に答える