web-dev-qa-db-ja.com

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

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

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

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

40
Phil.Wheeler

Factory Methodは通常、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");
    }
}

Abstract Factoryは、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();
    }
}

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

45
pdr