1
package com.factory;

import java.util.HashMap;
import java.util.Map;

//Factory class
class FactoryClass {
        Map products = new HashMap();

        void registerProduct(String prodId, ProductInt prodInterface) {
            products.put(prodId, prodInterface);
        }

        ProductInt createProduct(String prodId) {
            return ((ProductInt) products.get(prodId)).createProduct();
        }
}    

// Client
public class FactoryPattern {
    public static void main(String[] args) {
        FactoryClass factory = new FactoryClass();
        factory.createProduct("pen");
    }
}

package com.factory;

//Interface Product
public interface ProductInt {
    ProductInt createProduct();
}

// Concrete Product-1
class Pen implements ProductInt {
    static {
        FactoryClass factory = new FactoryClass();
        factory.registerProduct("pen", new Pen());
    }

    public ProductInt createProduct() {
        return new Pen();
    }
}

// Concrete Product-2
class Pencil implements ProductInt {
    static {
        FactoryClass factory = new FactoryClass();
        factory.registerProduct("pencil", new Pencil());
    }
    public ProductInt createProduct() {
        return new Pencil();
    }

}

このコードを実行すると、ハッシュマップに製品が登録されていないため、nullpointer が返されます。したがって、「pencil」の Product インスタンスを要求したとき、具体的な Pencil クラス オブジェクトを返すキーが見つかりませんでした。これをコーディングするのを手伝ってくれる人はいますか? Factory と具体的なクラスの間に直接の関係があってはならないようなものです。 、登録が Factory クラスの外にとどまり、要求する適切な具体的なクラス オブジェクトを取得する必要がありますか?

ありがとうバラジ

4

3 に答える 3

0

あなたはあなたの別々のインスタンスを作成していますFactoryClass- これらのインスタンスのそれぞれはそれらの中に独自のインスタンスを持っていMap productsます -メソッドで作成するファクトリはあなたが作成して登録するファクトリとmain()は異なります。明らかに、に登録されているアイテムはありません。penpencilFactoryClass.products

1 つの方法は、コード全体として、他の場所で他の改善が必要なように見えても、as で宣言することです。これにより、差し迫った問題が解決されますMap productsFactoryClassstatic

于 2012-09-12T16:11:50.383 に答える
0

カップルの問題:

まず、ファクトリ メソッドは、static作成中のクラスとは異なるクラスである必要があります。したがってinterface、インターフェイスのインスタンスを作成する唯一のメソッドを持つ は、実際には論理的ではありません。InterfaceAのインスタンスを作成する場合InterfaceBや、インターフェイスがジェネリックFactoryInterface<X>で のインスタンスを作成する場合がありますX。Guava の Supplierインターフェイスを参照してください

たとえば、メソッドは静的ではないため、インスタンスが既にない限り、 Pen... を呼び出すことはできません。Pen.createProduct()Pen

したがって、上記を考慮してFactoryProducer<X>またはSupplier<X>のインスタンスを作成することを検討してくださいX

次に、ファクトリ クラスを a にすることを検討してくださいSingleton。あなたが抱えている問題は、静的に初期化されるたびに、すぐに破棄される新しいファクトリ インスタンスが作成されることです。したがって、後でマップされた値を取得しようとすると、登録されたインスタンスとは異なるインスタンスから取得されます。

最後に、クラスの静的イニシャライザは、クラスが何らかの方法で利用または変更されるまで呼び出されません。何かを呼び出して、静的初期化ブロックを呼び出して自分自身を登録する必要がありPenますPencil

于 2012-09-12T16:23:48.303 に答える