是否应使用工厂模式来设置状态或类型

时间:2012-07-24 00:45:18

标签: design-patterns factory-pattern

工厂只创建正确的类型

所以这是Factory仅返回正确类型的示例:

public class BirdFactory
{
    public static IBird CreateBird(string birdType)
    {
        switch (birdType)
        {
            case "Eagle":
                return new Eagle();
            case "Penguin":
                return new Penguin();
        }
    }
}

用过:

IBird bird = BirdFactory.CreateBird("eagle");
bird.FlyToLocation(new Location("London"));

保理创建正确的类型和设置状态

以下是用于设置状态和类型的工厂示例:

public class BirdFactory
{
    public static IBird CreateBird(string birdType, Location locationToFlyTo)
    {
        switch (birdType)
        {
            case "Eagle":
                return new Eagle(locationToFlyTo);
            case "Penguin":
                return new Penguin(locationToFlyTo);
        }
    }
}

用过:

IBird bird = BirdFactory.CreateBird("eagle", new Location("London"));
bird.FlyToLocation();

问题

第二次练习的可接受程度如何?哪个更易于维护?

4 个答案:

答案 0 :(得分:2)

没有基本规则,您无法在工厂模式中设置状态和类型。确实合并模式是一种可接受的做法。因此,如果您非常确定第二种方法能够完美地满足您的需求,那就去吧。

我比方法二更喜欢方法1,因为它不那么模糊。

IBird bird = BirdFactory.CreateBird("eagle", new Location("London"));

可能会引导读者认为老鹰在伦敦“生活”(或出生)。

下一行:

bird.FlyToLocation();

会困扰他们:“它飞到哪里?哦!你的意思是这只鸟必须飞往伦敦?”

bird.FlyToLocation(new Location("London"));

避免这种含糊不清。

答案 1 :(得分:1)

第一种做法更好。在第二个你将位置传递给构造函数,该位置实际上与鸟无关。该位置适用于FlyToLocation方法,应尽可能接近该方法调用。

答案 2 :(得分:0)

我认为这取决于对象所需的初始化的复杂性。如果它只是一个属性,那么你最终得到的代码的复杂性可能是不值得的。

但是,在我想要进行一些复杂的初始化的情况下,我已将构建器模式与工厂模式合并。

答案 3 :(得分:0)

尽管如此,正如已经说过的那样,你可以做的事情没有限制,但保持简单和妥协的责任是关键,因为它被称为 - 良好的设计。 所以工厂方法本身应该只负责创建对象 - 在这种情况下是IBird实例,如果实现也需要一个位置,我会在工厂继续使用一些默认位置,无论它在哪里使用 - 之后设置位置。通过这种方式,您也可以在以后修改工厂。 您将看到此机制灵活的一个示例如下。想象一下,你有你所描述的工厂 - 传递位置的地方。如果明天你决定改变所使用的IBird的实现,所以它不再使用该位置怎么办 - 你需要修改界面工厂方法,这将是一笔交易。

此致 Artak