ファクトリパターンと抽象ファクトリの違いは何ですか?


40

最終的にいくつかの基本的なパターンを習おうと真剣に始めたので(キャリアの非常に遅いですが、それは別の話です)、私はファクトリーパターンとアブストラクトファクトリーの違いを理解しようとしています。

これら2つのパターンの主な違いは何ですか?

Factoryメソッドは継承を介してオブジェクトを作成し、Abstract Factoryはオブジェクトの構成を介してオブジェクトを作成することを理解していますが、実際的な観点からは、それぞれがどのように機能するかを正確に視覚化するのにまだ苦労しています。



2
明確にするために、「ファクトリーパターン」と言うとき、「ファクトリーメソッド」を意味しますか?Gang of Fourパターンについて話している場合、Factoryパターンはありませんが、Abstract FactoryとFactory Methodがあります。
トーマスオーエンズ

はい-工場メソッド。
Phil.Wheeler

3
公平を期すために、2つのフレーズはかなり一般的に入れ替わっているようです。
Phil.Wheeler

1
ああ、ファクトリーメソッド。newメソッドではないという事実の回避策(一部の-確かに一般的な-オブジェクトシステム)。
ドナルドフェローズ

回答:


44

ファクトリメソッドは、通常、各ケースは、呼び出し元のコードが実装について決定を下す必要がありませんように、同じルートインタフェースを使用して、異なるクラスを返すswitchステートメントによって分類されます。

カードの種類ごとに異なるバリデータを返すクレジットカードバリデータファクトリを考えてください。

public ICardValidator GetCardValidator (string cardType)
{
    switch (cardType.ToLower())
    {
        case "visa":
            return new VisaCardValidator();
        case "mastercard":
        case "ecmc":
            return new MastercardValidator();
        default:
            throw new CreditCardTypeException("Do not recognise this type");
    }
}

抽象ファクトリーは、異なる方法から多くの異なる種類を返すことができる1つのインターフェイスから派生しますが、複数の具体的なファクトリクラス(ないファクトリーメソッド)を持っているところです。

バリアントルールのセットごとに異なるクラスを持つチェスゲームマネージャーを考えてください。

public class StandardChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new StandardChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new StandardChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new StandardMoveClock();
    }
}

public class HexagonalChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new HexagonalChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new HexagonalChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new StandardMoveClock();
    }
}

public class SpeedChessRulesFactory : IChessRulesFactory
{
    public IBoardMapper GetBoardMapper()
    {
        return new StandardChessBoardMapper();
    }

    public IKingMover GetKingMover()
    {
        return new StandardChessKingMover();
    }

    public IMoveClock GetMoveClock()
    {
        return new SpeedChessMoveClock();
    }
}

戦略によく似た抽象ファクトリは、多くの場合ファクトリメソッドを使用して選択されますが、それらを結合する必要はないため、独自のパターンです。


3
Factoryメソッドの説明は正しいですか?「ファクトリメソッドパターンは継承に依存しています。オブジェクトの作成はオブジェクトを作成するファクトリメソッドを実装するサブクラスに委任されるためです」したがって、この例は静的ファクトリーに似ています。
SerG 14年

@SerGまあ、公正に、あなたはウィキペディアから、3年前に非常に異なって読むページでその引用を拾いました。現在のウィキペディアのページはいくつかの場所で矛盾していると私は主張しますが、それを区別することに関与したいという欲求はありません。後から考えて、私がここで提供した例は、パラメーター化されたファクトリーメソッドとして知られる特定の種類のファクトリーメソッドであることです。しかし、Factory MethodとAbstract Factoryの違いに関するポイントは、すべてのタイプのFactory Methodに当てはまります。
pdr 14年

2
GoFの「デザインパターン」には、引用と同じ記述があります。また、パラメータ化されたFMについても説明しています。
SerG 14年

重要な部分は、特定の状況に応じて、ファクトリーが呼び出し元に適切なオブジェクトを提供し、呼び出し元がそのオブジェクトのクラスを正確に知る必要がなく、特定のオブジェクトの方法を知る必要がないことです。オブジェクトが呼び出し元が知っているインターフェイスをサポートしている限り、選択されました。
gnasher729

あなたの答えは、あなたの例は典型的なファクトリメソッドパターンではなく、パラメータ化されたファクトリメソッドという名前の特殊化であると明確に述べるべきです。そして、典型的なファクトリーメソッドの定義について書いてください。それは今、それが間違っているからです。私はただファクトリー・メソッド・パターンについて学び、すべてを理解した後、ファクトリー・メソッド・パターンを別のものとして示すその答えを読んで、混乱しました。その例が典型的なファクトリメソッドパターンではないという情報はありません。コメントで指摘してくれたSerGに感謝します。
ctomek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.