如果我的工厂方法需要不同的参数用于不同的实现,我该怎么办?

Sam*_*der 2 .net parameters factory-method

我有一个接口,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)    
}
Run Code Online (Sandbox Code Playgroud)

我不希望这个类完成创建这些消息的所有工作,所以它只是委托给一个MessageCreatorFactory 产生IMessageCreator取决于给定类型的枚举(基于消息类型TypeA,TypeB,TypeC等的枚举)

interface IMessageCreator
{
     IMessage Create(MessageParams params);
}
Run Code Online (Sandbox Code Playgroud)

所以,我有4个实现IMessageCreator:TypeAMessageCreator,TypeBMessageCreator,TypeCMessageCreator,TypeDMessageCreator

我确定这个,除了因为每个类型需要不同的参数我必须创建一个MessageParams对象,其中包含4个不同参数的4个属性,但每个参数中只使用其中一些IMessageCreator.

有替代方案吗?另一个想法是让一个param数组作为Create方法中的参数,但是这看起来更糟,因为你不知道params是什么.或者在接口中创建几个Create的重载,如果它们不适合那个特定的实现,它们中的一些会抛出异常(即你调用了一个需要更多参数的方法,所以你应该调用其中一个重载.)

这看起来好吗?有更好的解决方案吗?

Ree*_*sey 5

这实际上违反了Factory方法模式的精神.如果您需要不同的参数来构造不同类型,则会隐含地强制调用者事先知道正在构造的类型.这完全消除了这种模式的好处.

例如,如果要指定枚举(TypeA,TypeB,TypeC),则可以直接构造TypeA.如果要允许多个子类实现TypeA,请为TypeA创建工厂...