5

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?

+0

Und die Frage wäre ...? – Isaac

+0

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 –

Antwort

10

Hier ist meine Interpretation dieser Frage und meine Antwort:

Die Fabrik muss die entsprechende Strategie erstellen. Es kann dies nur tun, wenn es über die Eigenschaften des Darlehens weiß. Daher muss die Fabrik das Darlehen erhalten, egal welche Injektionsmethode Sie bevorzugen, und dann die Eigenschaften des Darlehens verwenden, um zu entscheiden, welche Strategie zurückgegeben werden soll.

So jetzt haben Sie eine Strategie, die für die Art des Darlehens geeignet ist, müssen Sie das Kapital berechnen. Auch dies hängt von den Eigenschaften des Darlehens ab. Daher benötigt die Strategie das Darlehen. Dies könnte über einen Konstruktor in der Fabrik oder über einen Parameter der Methode capital/calculateCapital erfolgen.

Dies hält es schön und einfach, locker gekoppelt und abstrakt.

Etwas wie:

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