2016-08-07 9 views
1

In Factory method Muster gibt es 2 führen Umsetzung (korrigiert mich wenn ich falsch liege):Fabrikmethodenmuster - wann sollte die 'Creator'-Klasse die Factory-Methode implementieren?

Wenn Creator Klasse abstract sein und nicht eine Implementierung für die Factory method Bereitstellung:

public abstract class CasinoGameCreator { 

public void playGame() { 
    ICasinoGameType gameType = createGame(); 
    gameType.play(); 
} 

public abstract ICasinoGameType createGame(); 

Or, können wir die Creator Klasse eine konkrete Klasse sein, die Implementierung für die Factory method bereitstellt:

public class CasinoGame { 

    public static CasinoGame createGame(GameType type) { 
     if (type == GameType.BlackJack) { 
      return new BlackJackGame(); 
     } else if (type == GameType.Poker) { 
      return new PokerGame(); 
     } else { 
      return null; 
     } 
    } 
} 

Gibt es eine starke Präferenz für die Verwendung jeder Implementierung? Wenn ja, in welchen allgemeinen Situationen würden wir es vorziehen, den ersten Ansatz über den zweiten zu verwenden?

+0

Ich glaube, Sie beziehen sich auf das [abstrakte Fabrikmuster] (https://dzone.com/articles/intro-design-patterns-abstract) und das [Fabrikmethodenmuster] (https://dzone.com/artikel/gof-design-patterns-factory-me). Mögliche Antworten auf Ihre Frage zu SO [finden Sie hier] (http://stackoverflow.com/questions/5739611/differences-between-abstract-factory-pattern-and-factory-method) – Tagc

+1

Ihr zweites Beispiel ist kein [ Factory Method Pattern] (http://www.oodesign.com/factory-method-pattern.html), aber ein [Factory Pattern] (http://www.oodesign.com/factory-pattern.html). Wollten Sie eigentlich zwei verschiedene Muster vergleichen? Oder hast du falsch verstanden, was die beiden Optionen für Factory * Method * Pattern sind? – Andreas

+0

@Andreas - Ich war mir sicher, dass sie das gleiche "Factory Method Pattern" sind, also denke ich, dass ich falsch verstanden habe, obwohl das zweite Beispiel von _Cracking the coding, 6th edition_ book übernommen wurde, also ist das für mich sehr seltsam ... – Nimrod

Antwort

1

Option 1 folgt der Open/closed principle. Das bedeutet: Es ist offen für Erweiterungen (da verschiedene Unterklassen unterschiedliche Arten der Erstellung eines Spiels implementieren können); aber es ist für Änderungen geschlossen - das Verhalten von playGame() ist behoben. Nun, ist es nicht; Aber wenn Sie dieses Muster verwenden, möchten Sie playGame() wirklich endgültig machen. Wenn Sie eine solche abstrakte Klasse mit einer Implementierung X haben; und eine abstrakte Methode Y (verwendet innerhalb der anderen Methode X); als es nicht viel Sinn, Unterklassen X ändern zu lassen.

Option 2 ist hilfreich, wenn Sie sich über die verschiedenen Arten von Spielen wirklich sicher sind; Bedeutung: Chancen, dass diese Enum sich jemals ändern wird, sind gering. Angesichts der Idee von Spielen im Casino; Ich bezweifle sehr, dass dies hier wahr wäre. Wahrscheinlich könntest du jeden zweiten Tag ein neues Spiel hinzufügen. Und dann müssen Sie sich an jeden Ort wenden, der den GameType umschaltet und diesen Code anpasst.

Also, mit diesen Gedanken wäre Option 1 die erste Wahl - weil Sie einfach einen neuen Spieltyp hinzufügen können, indem Sie eine neue Unterklasse Ihrer Erstellerklasse erstellen. Das bedeutet: Sie können ein neues Spiel hinzufügen, ohne den Code zu berühren, der für andere Spiele verantwortlich ist.

Natürlich: Wenn Sie ein anderes Beispiel wählen würden, könnten die Anforderungen anders sein, und dann könnte Option 2 bestimmte Vorteile haben.

Verwandte Themen