工厂模式和抽象工厂之间有什么区别?


40

终于开始认真尝试学习一些基本模式(在职业生涯的后期,但这是一个不同的故事),我试图弄清Factory Pattern和Abstract Factory之间的区别。

这两种模式之间的主要区别是什么?

我知道Factory方法是通过继承创建对象的,而Abstract Factory是通过对象组合来创建的,但是从实际的角度来看,我仍然很难准确地看到它们各自的工作方式。



2
为了澄清,当您说“工厂模式”时,您是指“工厂方法”吗?如果您在谈论“四人帮”模式,则没有工厂模式,但是有抽象工厂和工厂方法。
Thomas Owens

是-工厂方法。
Phil.Wheeler 2011年

3
公平地说,这两个词组似乎经常互换。
Phil.Wheeler 2011年

1
啊,工厂方法。new不是方法的事实的变通办法(在某些-公认的通用对象系统中)。
Donal Fellows

Answers:


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

在“ 抽象工厂”中,您可以从一个接口派生多个具体的工厂类(而不是“工厂方法”),这些类可能从不同的方法返回许多不同的类型。

对于每组变体规则,考虑一个具有不同类别的国际象棋游戏管理器。

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
工厂方法的解释正确吗?关于“工厂方法模式依赖于继承,因为对象创建委托给实现工厂方法来创建对象的子类 ”。因此,该示例更像静态工厂。
SerG 2014年

@SerG好吧,公平地说,您是从Wikipedia上摘录的,该页面的读物与三年前大相径庭。我会争辩说,当前的Wikipedia页面在几个地方都存在矛盾,但是我不希望参与其中。事后看来,我要承认的是,我在这里提供的示例是一种特定的工厂方法,称为参数化工厂方法。但是,关于工厂方法和抽象工厂的区别的观点在所有类型的工厂方法中都适用。
pdr 2014年

2
与我的引用相同的陈述存在于GoF“设计模式”中。在那里也描述了参数化FM。
SerG 2014年

重要的是,工厂将根据特定情况为调用方提供合适的对象,并且调用方不需要知道该对象的确切类,也不需要知道特定对象的方式只要对象支持调用者知道的接口,就可以选择。
gnasher729

您应该在答案中明确指出,您的示例不是典型的工厂方法模式,而是某些名为参数化工厂方法的专业化方法。并写出典型工厂方法的定义,因为它现在错位了。我只是在学习工厂方法模式,我了解了所有内容,然后我读了那个答案,显示出工厂方法模式与众不同,这让我感到困惑。没有关于该示例不是典型工厂方法模式的信息。感谢SerG在评论中对此进行初始化。
ctomek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.