2016-08-07 15 views
1

2リード実装(私が間違っているなら、私を修正)があります。ファクトリメソッドのパターン - 「作成者」クラスはいつFactoryメソッドを実装する必要がありますか? <code>Factory method</code>パターンでは

CreatorクラスはabstractであるとFactory methodのための実装を提供していないとき:

public abstract class CasinoGameCreator { 

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

public abstract ICasinoGameType createGame(); 

かをの場合、クラスは、Factory methodの実装を提供する具体的なクラスにすることができます。

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; 
     } 
    } 
} 

各実装を使用する際には、どんな強みがありますか?もしあれば、どのような一般的な状況で私たちは第2アプローチよりも第1アプローチを好むだろうか?

+0

[抽象ファクトリパターン](https://dzone.com/articles/intro-design-patterns-abstract)と[ファクトリメソッドパターン](https://dzone.com)を参照していると思います/ articles/gof-design-patterns-factory-me)を参照してください。あなたの質問に対する可能な答えはここにあります[http://stackoverflow.com/questions/5739611/differences-between-abstract-factory-pattern-and-factory-method] – Tagc

+1

あなたの2番目の例は[ Factory Pattern](http://www.oodesign.com/factory-method-pattern.html)であるが、[Factory Pattern](http://www.oodesign.com/factory-pattern.html)である。あなたは実際に2つの異なるパターンを比較しようとしましたか?あるいは、Factory * Method * Patternの2つのオプションが何であるか誤解しましたか? – Andreas

+0

@アンドレアス - 私は彼らが同じ「ファクトリメソッドパターン」であると確信していたので、私は誤解を招いていると思いますが、第2の例はコーディングの第6版を取りました。 – Nimrod

答えて

1

オプション1は、Open/closed principleに従います。これは、拡張機能のためにオープンされていることを意味します(異なるサブクラスがゲームを作成するさまざまな方法を実装できるため)。それは修正のために閉じられています - playGame()の動作は修正されています。まあ、そうではありません。このパターンを使用すると、実際にplayGame()をfinalにしたいと思うでしょう。実装Xを持つ抽象クラスがある場合は、および抽象メソッドY(他のメソッドX内で使用される)サブクラスがXを変更できるようにするのはあまり意味がありません。

オプション2は、さまざまな種類のゲームについて本当に分かっている場合に役立ちます。つまり、この列挙型が変更される可能性は小さいです。カジノでゲームのアイデアを考えると、私はこれが本当であることを非常に疑う。おそらくあなたは一日おきに新しいゲームを追加することができます。そして、GameTypeを切り替える各場所に移動し、そのコードを適合させなければなりません。

これらの考えを考慮すると、クリエイタークラスの新しいサブクラスを作成するだけで新しいゲームタイプを追加できるので、オプション1が最初の選択肢になります。つまり、その他のゲームを担当するコードに触れることなく新しいゲームを追加できます。

もちろん、別の例を選択する場合、要件が異なる可能性があり、オプション2に一定の利点があるかもしれません。