Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个聚合设计模式有名字吗?_C#_Oop_Design Patterns - Fatal编程技术网

C# 这个聚合设计模式有名字吗?

C# 这个聚合设计模式有名字吗?,c#,oop,design-patterns,C#,Oop,Design Patterns,当我想避免使用大型switch语句时,我经常使用以下模式(请原谅陈腐的“动物”主题): 公共枚举动物类型{狗、猫、仓鼠} 公共接口IAnimal { AnimalType AnimalType{get;} } 公共类Cat:IAnimal { public AnimalType AnimalType{get{return AnimalType.Cat;}} } 公共类动物聚集器 { 私人只读词典; 公共动物聚集器(IEnumerable AnimalAggregator) { _动物=动物.To

当我想避免使用大型switch语句时,我经常使用以下模式(请原谅陈腐的“动物”主题):

公共枚举动物类型{狗、猫、仓鼠}
公共接口IAnimal
{
AnimalType AnimalType{get;}
}
公共类Cat:IAnimal
{
public AnimalType AnimalType{get{return AnimalType.Cat;}}
}
公共类动物聚集器
{
私人只读词典;
公共动物聚集器(IEnumerable AnimalAggregator)
{
_动物=动物.ToDictionary(a=>a.AnimalType);
}
公共IAnimal Get(AnimalType AnimalType)
{
动物;
返回_animals.TryGetValue(animalType,out animal)?animal:null;
}
}
在上面的示例中,我将依赖于
AnimalAggregator
,并允许IoC容器连接所有
IAnimal
的注入。然后,我只调用
animalAggregator.Get(AnimalType.Cat)
,而不是编写一个大的switch语句来检索与
AnimalType.Cat
关联的
IAnimal

我在我的项目中多次使用这种模式(及其变体),但不知道该如何称呼它——我倾向于使用“聚合器”,但我不确定这是否准确。不过,我从未在自己的代码之外看到过它


它有名字吗?

我觉得它应该是一个抽象的工厂模式:

提供用于创建相关族或从属族的接口 对象,而不指定其具体类

然后,您将拥有一个AnimalFactory,每个动物类型具有不同的GetMethods。 我想您可能有一个通用的get方法,但这违背了抽象工厂的目的。既然您在任何方面都受到枚举的限制,为什么不为每种类型设置一个方法呢


有关更多信息,请参见

我认为这只是抽象工厂模式的一种变体。剩下要做的唯一一件事是使
AnimalAggregator
扩展
IAnimalFactory
接口,并将客户端代码更改为依赖于
IAnimalFactory
而不是
AnimalAggregator

public inteface IAnimalFactory
{
    IAnimal Get(AnimalType t);
}

为什么不使用抽象工厂模式呢?这段代码的目的是什么?您是否为每种动物类型创建一个实例,然后扔掉所有实例(除了所需的实例)以避免打开动物类型?@AlexG:无法对名称进行注释,但您的
Get
方法不需要三元运算符。它会自动将
IAnimal
的默认值分配给
animal
。所以你的代码可以是:
IAnimal animal_动物。TryGetValue(动物类型,非动物);返回动物
@DanielBrückner当我有许多类实现同一个接口,并且我想在它们之间动态地选择时,它往往是适用的。我想你可以把它比作一个抽象工厂,但它实际上并没有创建对象,只是将请求路由到所需的实例。@AlexG好的,那么dispatcher可能比aggregator更好,它只是通过首先收集集合中的所有实例来进行分派,这是一个实现细节。泛型get违背了抽象工厂的目的。“泛型get违背了抽象工厂的目的”-不,这是抽象工厂的目的。。。
public inteface IAnimalFactory
{
    IAnimal Get(AnimalType t);
}