팩토리 패턴과 추상 팩토리의 차이점은 무엇입니까?


40

마침내 몇 가지 기본 패턴을 배우려고 진지하게 노력하기 시작했습니다 (직종에 늦었지만 이야기는 다릅니다). 나는 팩토리 패턴과 추상 팩토리의 차이점에 대해 고심하려고 노력하고 있습니다.

이 두 패턴의 주요 차이점은 무엇입니까?

Factory Method는 상속을 통해 객체를 생성하고 Abstract Factory는 객체 구성을 통해 객체를 생성하지만 실제로는 각각의 작동 방식을 정확하게 시각화하는 데 문제가 있습니다.



2
명확히하기 위해 "공장 패턴"이라고 말할 때 "공장 방법"을 의미합니까? 4 가지 패턴에 대해 이야기하는 경우 팩토리 패턴은 없지만 추상 팩토리 및 팩토리 메소드가 있습니다.
Thomas Owens

예-공장 방법.
Phil.Wheeler

3
공평하게 말하면, 두 문구는 꽤 일반적으로 상호 교환되는 것 같습니다.
Phil.Wheeler

1
아, 공장 방법. 방법 new이 아니라는 사실에 대한 해결 방법 (일부 – 일반적으로 객체 시스템).
Donal Fellows

답변:


44

공장 방법은 일반적으로 각각의 경우가 호출 코드 구현에 대한 결정을 내릴 필요가 없습니다 있도록 동일한 루트 인터페이스를 사용하여, 다른 클래스를 반환하는 스위치 문으로 분류됩니다.

각 카드 유형에 대해 다른 유효성 검사기를 반환하는 신용 ​​카드 검사기 팩토리를 생각해보십시오.

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

추상 공장은 당신이 다른 방법에서 많은 다른 유형을 반환 할 수 있습니다 하나의 인터페이스에서 파생 된 여러 콘크리트 공장 클래스 (안 공장 방법)가있는 곳입니다.

각 변형 규칙 세트마다 다른 클래스를 가진 체스 게임 관리자를 생각해보십시오.

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
팩토리 메소드에 대한 설명이 맞습니까? "팩토리 메소드 패턴은 오브젝트 작성이 팩토리 메소드를 구현하여 오브젝트를 작성하는 서브 클래스에 위임 되므로 상속에 의존합니다 ." 따라서이 예는 Static Factory와 비슷합니다.
SerG

@SerG 글쎄, 공평하게, 당신은 Wikipedia에서 그 인용구를 3 년 전에 매우 다르게 읽은 페이지에서 선택했습니다. 나는 현재 위키 백과 페이지가 여러 곳에서 모순된다고 주장하지만, 그것을 분리하는 데 관여하고 싶지는 않다. 내가 이해하고자하는 것은 여기에 제공 한 예제는 특정 유형의 팩토리 메소드이며 매개 변수화 된 팩토리 메소드라는 것입니다. 그러나 Factory Method와 Abstract Factory의 차이점에 대한 요점은 모든 유형의 Factory Method에 적용됩니다.
pdr

2
GoF "Design Patterns" 에는 제 인용문 과 같은 내용 이 있습니다. 그리고 Parameterized FM에 대해서도 설명되어 있습니다.
SerG

중요한 부분은 팩토리가 특정 상황에 따라 호출자에게 적합한 오브젝트를 제공하고 호출자가 해당 오브젝트의 클래스를 정확히 알 필요가 없으며 특정 오브젝트가 어떻게 작동하는지 알 필요가 없다는 것입니다 객체가 호출자가 알고있는 인터페이스를 지원하는 한
gnasher729

귀하의 예는 전형적인 팩토리 메소드 패턴이 아니라 매개 변수화 된 팩토리 메소드라는 일부 특수화라는 답변을 명확하게 진술해야합니다. 그리고 현재 팩토리 메소드의 정의에 대해 적어보십시오. 오해되기 때문입니다. 나는 공장 방법 패턴에 대해 배우고 있었고 모든 것을 이해 한 다음 공장 방법 패턴을 다른 것으로 보여주는 대답을 읽었고 혼란 스러웠습니다. 일반적인 팩토리 메소드 패턴이 아닌 해당 예제에 대한 정보는 없습니다. 의견에서 poiniting을 한 SerG에게 감사드립니다.
ctomek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.