1

私が自動車メーカーの Java ソフトウェア開発者であると想像してください。私は、多数の社内アプリケーションで使用されるライブラリの作成を任されています。製造された自動車モデルのタイプごとに、そのモデルを表す Java オブジェクトを作成します。現行モデルだけでなく、プロトタイプモデルも追跡できなければなりません。プロトタイプ モデルには 1 つの名前が付けられますが、それが生産に入ると変更される可能性が非常に高くなります。ライブラリを使用して、プロトタイプを説明し、本番環境に切り替えたときに名前が変更されるようにする必要があります。

私の質問は、これに対する最善のアプローチは何ですか?

ここに私の考えがあります...

この状況をうまく処理するためのアイデアを求めて、私は何冊かの本を読んできました。すぐに、工場のパターンを使用することに頭が下がります。各モデルの具体的なオブジェクトを返す CarModelFactory クラスがあります。例えば:

public class CarModelFactory() {

    public CarModel createCivicModel() {}
    public CarModel createAccordModel() {}
    public CarModel createPrototype1() {
        return new ModelX();
    }
    public CarModel createPrototype1() {
        return new ModelY();
    }

これが最善のアプローチでしょうか?抽象化の別のレイヤーが必要だと思います。私が見る問題は次のとおりです。

1) ModelX が本番環境に入った場合、そのためのメソッドを作成し、createPrototype1 メソッドに別のものを配置すると、そのメソッドを呼び出すプログラムが間違ったオブジェクトを取得するようになりました

2) ModelX の名前を変更するにはどうすればよいですか?

お時間をいただきありがとうございます!

4

1 に答える 1

2

ファクトリ モデルは良createCarModel(String model)さそうですが、マップ内で適切なオブジェクトを検索する方法をお勧めします。車のモデルの名前を変更するには、そのマップで簡単に追加/削除します。もちろん、適切な同期を使用して、名前の変更と取得が衝突するのを防ぎます。

マップは である可能性が高くMap<String, Class<? extends CarModel>>、メソッドは引数なしのコンストラクターを使用してクラスをインスタンス化します。これは、すべての screateCarに必要です。Car

このように、ファクトリ クラスはメソッド シグネチャのセットを変更しないため、モデルを追加または名前変更するたびに再コンパイルする必要はありません。

さらに、 をオーバーライドするClassLoaderと、古いモデルをアンロードして新しいモデルをロードできるため、.class ファイルを含む実際のディレクトリをクリーンに保つことができます (実際のモデルに作成された古いプロトタイプ クラスはありません)。

于 2011-03-16T17:01:04.037 に答える