1

工厂只创建正确的类型

所以这里是一个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

4 回答 4

3

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

我更喜欢方法 1 而不是方法 2,因为它不那么模棱两可。

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

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

下一行:

bird.FlyToLocation();

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

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

避免了这种歧义。

于 2012-07-24T03:21:56.413 回答
2

第一次练习更好。在第二个中,您将位置传递给构造函数,而位置实际上与鸟无关。该位置用于 FlyToLocation 方法,应尽可能靠近该方法调用。

于 2012-07-24T00:50:42.060 回答
0

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

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

于 2012-07-24T02:58:42.827 回答
0

尽管如前所述,您可以做的事情没有限制,但保持事情简单且职责分工明确是所谓的关键 - 良好的设计。所以工厂方法本身应该只负责创建对象——在这种情况下是 IBird 实例,如果实现也需要一个位置,我会继续在工厂中使用一些默认位置,以及将要使用的位置——之后设置位置。这样,您以后也可以修改工厂。您将看到此机制灵活的一个示例如下所示。想象一下,您有您所描述的工厂 - 传递位置的位置。如果明天您决定更改使用的 IBird 的实现,所以它不再使用该位置 - 你

问候, 阿尔塔克

于 2012-07-24T03:31:06.567 回答