5

さて、私はストラテジーとファクトリーの両方の設計パターンを使用するように求められる任務を与えられました。問題は次のとおりです。

あなたは、銀行が融資を処理するために使用するアプリケーションを開発しています。Loanメソッドを持つクラスがありcapital()ます。このcapital()メソッドには、Loan オブジェクト インスタンスの属性の一部をチェックし、属性に基づいてローンの種類に適した戦略を使用する醜い if-then-else 条件が含まれています。capital()メソッドの疑似コードは次のとおりです。

capital() {
    if (expiry == null && maturity != null) {
        // Find capital for term loan
        return commitment * duration * riskFactor;
    }
    if (expiry != null && maturity == null) {
        if (getUnusedPercentage() != 1.0) {
            // Find capital for revolving loan
            return commitment * unusedPercentage * duration * riskFactor;
        } else {
            // Find capital for complex loan
            return (outstandingRiskAmount * duration * riskFactor) + (unusedRiskAmount * duration * unusedRiskFactor);
        }
    }
}

このデザインに戦略パターンを導入したいと思います。適切な Strategy オブジェクトを作成する Factory を作成します。Factory を Singleton クラスにします。UML ダイアグラムを描画し、コードのスニペットを記述してcapital()メソッドを置き換えます。覚えておいてください: ストラテジーの使用に関する重要なこと: クライアントはコンテキスト オブジェクトを提供する必要があります。

さて、UML図を作成しました。私はシングルトンの理解にかなり固いので、そのことを理解したと思います。私は戦略もかなりよく理解していると思います。しかし、ストラテジー オブジェクトを作成する Factory を使用したセットアップが、これを行うための最良の方法であると自分自身に納得させるのに苦労しています。ここで私の図をチェックしてください。ローンをコンテキスト オブジェクトとして使用して、ローンを作成するクライアント オブジェクトを作成する予定です (ファクトリで作成することにより、ローン コンストラクターを介して適切な戦略で初期化します)。のcapital()メソッドは、構成された戦略を実行するだけです。私の理解が正しければ、ここでファクトリをセットアップする方法は、間接的なレイヤーを追加することにより、ローン (コンテキスト) を戦略から完全に分離するのに役立ちます。

私が確信していないことの 1 つは、元の資本メソッド内で行われた計算中に使用されるデータを取得する方法です。一部の戦略では、いくつかのパラメーターのみが使用されます (タームローンでは、コミットメント、期間、およびリスクファクターのみが使用されますが、複雑なローンでは、ローンの利用可能なすべての属性が使用されます)。calculateCapital()すべての戦略によって実装される私のメソッドは、パラメーターとして 6 つの属性すべてを持つ必要がありますか?

より良い結果を得るために、Strategy パターンで Factory を使用するより良い方法はありますか? 代わりに AbstractFactory または Factory Method を使用する必要がありますか?

4

1 に答える 1

11

この質問の私の解釈と私の答えは次のとおりです。

工場は適切な戦略を作成する必要があります。ローンのプロパティを知っている場合にのみ、これを行うことができます。したがって、任意の注入方法を使用してファクトリにローンを提供し、ローンのプロパティを使用して、どの戦略を返すかを決定する必要があります。

これで、ローンの種類に適した戦略ができたので、資本を計算する必要があります。繰り返しますが、これはローンの特性に依存します。したがって、戦略にはローンが必要です。これは、ファクトリのコンストラクターを介して、または capital/calculateCapital メソッドのパラメーターを介して注入できます。

これにより、シンプルで疎結合で抽象的な状態が保たれます。

何かのようなもの:

ICapitalStrategy s = LoanStrategyFactory.Create(loan);
s.CalculateCapital(loan);
于 2012-11-17T21:02:51.007 に答える