我有一个概念上的问题。我想使用设计模式工厂,使用枚举来知道要创建什么类型的对象。但是当涉及到在另一个程序集中继承时,我坚持使用我的enum…
让我解释一个案例:
我正在为管理水果的多个项目创建一个框架。
我创建了一个接口IFruit
,由一个抽象类Fruit
实现,它将继承Strawberry
, Apple
和Pear
。
我创建了一个包含Strawberry
、Apple
和Pear
的enum FruitTypes
。
我用一个虚拟方法创建了FruitFactory
:GiveMeANewFruit(FruitTypes newFruit)
返回IFruit
.
一切都ok。
我把我的框架送到世界各地,我们西班牙工厂的人也需要管理香蕉。
他将创建继承Fruit
的Banana
类。
他将创建一个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)