Okay, ich habe also eine Aufgabe erhalten, in der ich gebeten werde, sowohl das Strategie- als auch das Factory-Entwurfsmuster zu verwenden. Hier ist das Problem:Verwenden von Factory mit Strategie-Entwurfsmuster
Sie entwickeln eine Anwendung für eine Bank für den Umgang mit Darlehen. Es gibt eine Loan
Klasse mit einer Methode capital()
. Die Methode capital()
enthält eine hässliche if-then-else-Bedingung, die einige der Loan-Objektinstanzattribute überprüft und basierend auf den Attributen die richtige Strategie für den Kredittyp verwendet. Hier ist der Pseudocode für die capital()
Methode:
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);
}
}
}
Wir möchten das Strategie-Muster zu diesem Entwurf einzuführen. Erstellen Sie eine Factory, die das entsprechende Strategieobjekt erstellt. Machen Sie die Factory zu einer Singleton-Klasse. Zeichnen Sie ein UML-Diagramm und schreiben Sie die Cope-Snippets, um die Methode capital()
zu ersetzen. Denken Sie daran: Das Wichtigste bei der Verwendung einer Strategie: Der Client sollte ein Kontextobjekt bereitstellen.
Okay, also habe ich ein UML-Diagramm erstellt. Ich bin ziemlich solide in Bezug auf mein Verständnis von Singleton, also denke ich, dass ich es kapiert habe. Ich denke, ich verstehe Strategie auch ziemlich gut. Ich habe jedoch Probleme, mich selbst davon zu überzeugen, dass das Setup, das ich mit der Factory habe, die die Strategie-Objekte erstellt, der beste Weg ist, dies zu tun. Check out my diagram here. Ich plane, ein Kundenobjekt zu schreiben, das Kredite schafft, indem ich das Darlehen als Kontextobjekt verwende (indem ich es mit der entsprechenden Strategie durch den Kreditkonstruktor initialisiere, indem ich es mit der Fabrik erstelle). Die Methode capital()
führt dann einfach die Strategie aus, mit der sie konfiguriert wurde. Wenn mein Verständnis stimmt, so dient die Art und Weise, wie ich die Fabrik hier eingerichtet habe, dazu, den Kredit (Kontext) vollständig von der Strategie zu entkoppeln, indem ich eine indirekte Ebene hinzufüge.
Eine Sache, die ich unsicher bin, ist, wie man die Daten erhält, die während der Berechnung benutzt werden, die innerhalb der ursprünglichen Kapitalmethode geschah. Für einige der Strategien werden nur wenige Parameter verwendet (bei Term Loans werden nur Commitment, Duration und RiskFactor verwendet, aber komplexe Kredite verwenden alle verfügbaren Attribute des Kredits). Sollte meine calculateCapital()
Methode, die von allen Strategien implementiert wird, alle sechs Attribute als Parameter haben?
Gibt es eine bessere Möglichkeit, Factory mit dem Strategie-Muster zu verwenden, um ein besseres Ergebnis zu erzielen? Soll ich stattdessen AbstractFactory oder Factory Method verwenden?
Und die Frage wäre ...? – Isaac
vielleicht verwandt: http://stackoverflow.com/questions/5375187/strategie-design-pattern-and-factory-method-design-pattern. auch: http://www.codeproject.com/Artikel/9942/Refactoring-to-Patterns-Factory-und-Strategie-Patte und http://social.msdn.microsoft.com/Forums/is/architecturegeneral/thread/8218054d-969c-4066-ba05-24553f890465 –