5

好的,所以我被分配了一个任务,要求我同时使用策略和工厂设计模式。这是问题所在:

您正在为银行开发用于处理贷款的应用程序。有一个Loan类有一个方法capital()。该capital()方法包含一个丑陋的 if-then-else 条件,它检查一些 Loan 对象实例属性并根据属性对贷款类型使用正确的策略。这是该方法的伪代码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);
        }
    }
}

我们想在这个设计中引入策略模式。创建一个创建适当策略对象的工厂。使工厂成为单例类。绘制一个 UML 图并编写对应的代码片段来替换该capital()方法。记住:使用策略的关键是:客户端应该提供一个上下文对象。

好的,所以我已经绘制了一个 UML 图。我对 Singleton 的理解非常扎实,所以我认为我已经理解了。我想我也非常了解战略。但是,我无法说服自己,我使用 Factory 创建 Strategy 对象的设置是解决此问题的最佳方式。在这里查看我的图表。我计划编写一个创建贷款的客户端对象,使用贷款作为上下文对象(通过 Loan 构造函数通过工厂创建它,使用适当的策略对其进行初始化)。这capital()然后方法将执行它已配置的任何策略。如果我的理解是正确的,我在这里设置工厂的方式是通过添加一个间接层来将贷款(上下文)与策略完全分离。

我不确定的一件事是如何获取在原始资本方法内部发生的计算过程中使用的数据。对于某些策略,仅使用少数参数(对于定期贷款,仅使用承诺、期限和风险因素,但复杂贷款使用贷款的所有可用属性)。我的calculateCapital()方法(由所有策略实现)是否应该将所有六个属性都作为参数?

有没有更好的方法来使用带有策略模式的工厂来获得更好的结果?我应该改用 AbstractFactory 还是 Factory Method?

4

1 回答 1

11

这是我对这个问题的解释和我的回答:

工厂必须制定适当的策略。只有知道贷款的性质,它才能做到这一点。因此,必须通过您喜欢的任何注入方法向工厂提供贷款,然后使用贷款的属性来决定返还哪种策略。

因此,现在您有了适合贷款类型的策略,您必须计算资本。同样,这取决于贷款的性质。因此,策略需要贷款。这可以通过工厂中的构造函数或通过 capital/calculateCapital 方法的参数注入。

这使它保持美观和简单,松散耦合和抽象。

就像是:

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