さて、私はストラテジーとファクトリーの両方の設計パターンを使用するように求められる任務を与えられました。問題は次のとおりです。
あなたは、銀行が融資を処理するために使用するアプリケーションを開発しています。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 を使用する必要がありますか?