工厂只创建正确的类型
所以这是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();
问题
第二次练习的可接受程度如何?哪个更易于维护?
答案 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