.net - 如果我有一个工厂方法,不同的实现需要不同的参数,我该怎么办?

标签 .net parameters factory-method

我有一个接口(interface),IMessage 和一个类,其中有多种方法用于创建不同类型的消息,如下所示:

class MessageService
{
    IMessage TypeAMessage(param 1, param 2)
    IMessage TypeBMessage(param 1, param 2, param 3, param 4)
    IMessage TypeCMessage(param 1, param 2, param 3)
    IMessage TypeDMessage(param 1)    
}

我不希望此类完成创建这些消息的所有工作,因此它只是委托(delegate)给 MessageCreatorFactory ,它根据给定的类型生成 IMessageCreator (基于消息类型的枚举(TypeA、TypeB、TypeC 等)

interface IMessageCreator
{
     IMessage Create(MessageParams params);
}

所以我有 4 个 IMessageCreator 实现:TypeAMessageCreatorTypeBMessageCreatorTypeCMessageCreatorTypeDMessageCreator

我对此表示同意,除了因为每种类型需要不同的参数,我必须创建一个 MessageParams 对象,其中包含 4 个不同参数的 4 个属性,但只使用其中的一些在每个 IMessageCreator 中。

有替代方案吗?我的另一个想法是在 Create 方法中使用一个参数数组作为参数,但这似乎更糟糕,因为您不知道参数是什么。或者在接口(interface)中创建 Create 的多个重载,如果它们不适合该特定实现,则让其中一些重载抛出异常(即您调用了需要更多参数的方法,因此您应该调用其他重载之一。)

这看起来不错吗?有更好的解决办法吗?

最佳答案

这实在是违背了Factory method pattern的精神。 。如果您需要不同的参数来构造不同的类型,则隐式地强制调用者提前知道正在构造什么类型。这完全消除了这种模式的好处。

例如,如果您指定一个枚举(TypeA、TypeB、TypeC),您也可以直接构造 TypeA。如果你想允许多个子类实现TypeA,就为TypeA创建一个工厂...

关于.net - 如果我有一个工厂方法,不同的实现需要不同的参数,我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2567658/

相关文章:

c# - 如何使用 Visual Studio - 生成异步 WCF 调用?

drupal - 将参数传递到 Drupal 模块

design-patterns - 工厂模式中的参数化工厂 - 是否存在其他方式?

c# - DbParameter IsNullable 功能?

c# - 忙等待线程

c++ - 静态函数接收到错误的参数

ios - 带有字符串参数调用的 Swift 枚举函数,带有枚举类的参数

constructor - Dart 工厂(构造函数)与静态方法;例如,为什么 int.parse() 不是工厂构造函数?

c# - 字典中元素的顺序