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

.net 如果我有一个工厂方法,对于不同的实现需要不同的参数,我应该怎么做?,.net,parameters,factory-method,.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 TypeDMessag

我有一个接口、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)    
}
我不想让这个类完成创建这些消息的所有工作,所以它只是委托给一个MessageCreatorFactory,它根据给定的类型生成一个IMessageCreator,该类型基于消息的类型TypeA、TypeB、TypeC等等

interface IMessageCreator
{
     IMessage Create(MessageParams params);
}
所以我有4个IMessageCreator的实现:TypeAMessageCreator、TypeBMessageCreator、TypeCMessageCreator、TypeDMessageCreator

我同意这一点,只是因为每种类型都需要不同的参数,所以我必须创建一个MessageParams对象,其中包含4个不同参数的4个属性,但在每个IMessageCreator中只使用其中的一些属性

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


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

在我的建议中,有四个IMessage Create重载要比有一个带有MessageParam的方法好得多

只需为creator实现不支持的方法抛出一个异常


因此,当您再次打开代码时,您可能会在一周或一个月内受益匪浅。对您来说,这个实现将比当前的实现更为明显,这实际上是对本协议精神的违反。如果您需要不同的参数来构造不同的类型,那么您就是在隐式地迫使调用者提前知道要构造什么类型。这完全消除了这种模式的好处


例如,如果要指定枚举TypeA、TypeB、TypeC,最好直接构造TypeA。如果您想允许多个子类实现TypeA,请仅为TypeA创建一个工厂…

我看不出为什么TypeXMessageCreator类应该实现公共接口。我将完全摆脱IMessageCreator,只需要4个单独的工厂来创建IMessage对象

如果IMessage对象的创建需要一些公共逻辑,那么可以将该逻辑放在单独的类中,并在工厂中使用它


请记住,继承不是为了代码重用。

谢谢,我看到的问题是,如果不同参数的数量增加,那么重载的数量就会增加,每个现有的实现都需要更新以添加新的重载。而对于MessageParam对象,只需要添加一个新字段,而不需要更改任何其他内容。另外,如果我有一条新消息,它采用了不同的现有参数组合,我需要一个新的重载,但是使用现有的方法,我可以使用未更改的Messageparams.Man,我想到了这个主意。如果您想要拥有不同的creator类的主要原因是因为文件的大小,那么它是可以克服的。您可以创建分部类并用不同的文件分隔所有创建者,但它们都将位于一个工厂类中。