工厂设计模式使用枚举和继承

时间:2014-03-27 15:42:22

标签: c# inheritance enums factory

我有一个概念性的问题。我想使用设计模式工厂,使用枚举来了解要创建的对象类型。但是当谈到继承另一个集会时,我会坚持我的枚举...

让我解释一下案例:

我正在为管理水果的多个项目创建一个框架。

我创建了一个由抽象类IFruit实现的接口Fruit,从中继承StrawberryApplePear

我创建了一个包含FruitTypesStrawberryApple的枚举Pear

我使用虚拟方法创建FruitFactoryGiveMeANewFruit(FruitTypes newFruit),返回IFruit

一切都好。

我将我的框架发送到世界各地,我们西班牙工厂的某个人也需要管理香蕉。

他将创建继承Banana的{​​{1}}类。

他将创建一个Fruit,它将继承SpanishFruitFactory并重新定义虚拟方法FruitFactory,以下是该方法中的代码:

GiveMeANewFruit

但是,嘿,这就是问题所在。我知道像C#这样的语言不允许继承枚举。所以,我的家伙无法将Public Override IFruit GiveMeANewFruit(FruitTypes newFruit) { if (newFruit == FruitTypes.Banana) return new Banana(); else return base.GiveMeANewFruit(newFruit); } 值添加到Banana枚举。

那么,取代枚举的最佳模式是什么,这样我就可以为外界提供在我的概念中添加新对象类型的能力?

知道我不想在源代码之外有任何东西(没有XML文件,也没有数据库,也没有其他任何提供类型列表的东西)。

你有什么建议吗?

2 个答案:

答案 0 :(得分:0)

我认为最好的替代是static class。这就是我在php中这样做的方式。 使用字段而不是static class定义enum,如果愿意,您甚至可以将字段定义为string

答案 1 :(得分:0)

将工厂方法更改为接受int,并使用以下类实现枚举: -

public class FruitTypes
{
    public const int Strawberry = 1;
    public const int Apple = 2;
    public const int Pear = 3;
}

public class SpanishFruitTypes : FruitTypes
{
    public const int Banana = 4;
}

用法示例: -

factory.GiveMeANewFruit(FruitTypes.Pear)

factory.GiveMeANewFruit(SpanishFruitTypes.Banana)