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

本文关键字:工厂 设计模式 继承 枚举 | 更新日期: 2023-09-27 17:54:36

我有一个概念上的问题。我想使用设计模式工厂,使用枚举来知道要创建什么类型的对象。但是当涉及到在另一个程序集中继承时,我坚持使用我的enum…

让我解释一个案例:

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

我创建了一个接口IFruit,由一个抽象类Fruit实现,它将继承Strawberry, ApplePear

我创建了一个包含StrawberryApplePear的enum FruitTypes

我用一个虚拟方法创建了FruitFactory:GiveMeANewFruit(FruitTypes newFruit)返回IFruit .

一切都ok。

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

他将创建继承FruitBanana类。

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

Public Override IFruit GiveMeANewFruit(FruitTypes newFruit)
{
    if (newFruit == FruitTypes.Banana)
        return new Banana();
    else
        return base.GiveMeANewFruit(newFruit);
}

但是,嘿,问题来了。我知道像c#这样的语言不允许继承枚举。所以,我的家伙不能将Banana值添加到FruitTypes enum。

那么,替换enum的最佳模式是什么,这样我就可以给外部世界添加新对象类型到我的概念的能力?

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

你有什么建议吗?

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

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

更改工厂方法以接受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)