我有一个接口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);
}
所以我有IMessageCreator
的4个实现:TypeAMessageCreator
,TypeBMessageCreator
,TypeCMessageCreator
,TypeDMessageCreator
我确定这个,除了因为每个类型需要不同的参数,我必须创建一个MessageParams
对象,其中包含4个不同参数的4个属性,但每个参数中只使用了一些{ {1}}。
有替代方案吗?另一个想法是让一个param数组作为Create方法中的参数,但是这看起来更糟,因为你不知道params是什么。或者在接口中创建几个Create的重载,如果它们不适合那个特定的实现,它们中的一些会抛出异常(即你调用了一个需要更多参数的方法,所以你应该调用其中一个重载。)
这看起来好吗?有更好的解决方案吗?
答案 0 :(得分:5)
这实际上违反了Factory method pattern的精神。如果您需要不同的参数来构造不同类型,则会隐含地强制调用者事先知道正在构造的类型。这完全消除了这种模式的好处。
例如,如果您要指定枚举(TypeA,TypeB,TypeC),您也可以直接构造TypeA。如果要允许多个子类实现TypeA,请为TypeA ...
创建工厂答案 1 :(得分:0)
在我的意见中有四个重载的IMessage Create比使用MessageParam中的一个方法要好得多。
只为那些不受创建者实现支持的方法抛出异常。
因此,当您再次打开代码时,可能会在一周或一个月内获得巨大好处。这个实现对你来说更明显,那么当前的
答案 2 :(得分:0)
我认为你的TypeXMessageCreator
类应该实现一个通用接口没有任何理由。我会完全摆脱IMessageCreator
,只有4个独立的工厂来创建IMessage
个对象。
如果IMessage
对象的创建需要一些通用逻辑,您可以将该逻辑放在一个单独的类中,并在工厂内使用它。
请记住,继承不适用于代码重用。