使用工厂与战略设计模式

时间:2012-11-17 01:30:40

标签: design-patterns uml factory-pattern strategy-pattern

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

您正在为银行开发一个用于处理贷款的申请。有一个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);
        }
    }
}

我们想向此设计介绍策略模式。创建一个创建适当的Strategy对象的Factory。使工厂成为Singleton类。绘制UML图并编写cope片段以替换capital()方法。记住:使用策略的关键是:客户端应该提供上下文对象。

好的,我已经制定了一个UML图。我对单身人士的理解非常扎实,所以我觉得我对此有所了解。我想我也很了解策略。但是,我无法说服自己,我与Factory创建策略对象的设置是最好的方法。 Check out my diagram here。我计划编写一个客户对象来创建贷款,使用贷款作为上下文对象(通过贷款构造函数通过工厂创建适当的策略来初始化它)。然后capital()方法将执行它配置的任何策略。如果我的理解是正确的,我在这里设置工厂的方式是通过添加一个间接层来完全将贷款(上下文)与策略分离。

我不确定的一件事是如何获得在原始资本方法中发生的计算期间使用的数据。对于某些策略,仅使用了一些参数(对于定期贷款,仅使用承诺,持续时间和riskFactor,但复杂的贷款使用贷款的所有可用属性)。我的calculateCapital()方法是否由所有策略实现,是否将所有六个属性都作为参数?

有没有更好的方法将Factory与策略模式一起使用以获得更好的结果?我应该使用AbstractFactory还是Factory Method?

1 个答案:

答案 0 :(得分:10)

以下是我对这个问题的解释和答案:

工厂必须制定适当的策略。只有了解贷款的属性,它才能做到这一点。因此,工厂必须通过您喜欢的任何注入方法获得贷款,然后使用贷款的属性来决定回馈哪种策略。

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

这使它保持简洁,松散耦合和抽象。

类似的东西:

ICapitalStrategy s = LoanStrategyFactory.Create(loan);
s.CalculateCapital(loan);