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

时间:2010-04-02 16:02:25

标签: .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)    
}

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

interface IMessageCreator
{
     IMessage Create(MessageParams params);
}

所以我有IMessageCreator的4个实现:TypeAMessageCreatorTypeBMessageCreatorTypeCMessageCreatorTypeDMessageCreator

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

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

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

3 个答案:

答案 0 :(得分:5)

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

例如,如果您要指定枚举(TypeA,TypeB,TypeC),您也可以直接构造TypeA。如果要允许多个子类实现TypeA,请为TypeA ...

创建工厂

答案 1 :(得分:0)

在我的意见中有四个重载的IMessage Create比使用MessageParam中的一个方法要好得多。

只为那些不受创建者实现支持的方法抛出异常。

因此,当您再次打开代码时,可能会在一周或一个月内获得巨大好处。这个实现对你来说更明显,那么当前的

答案 2 :(得分:0)

我认为你的TypeXMessageCreator类应该实现一个通用接口没有任何理由。我会完全摆脱IMessageCreator,只有4个独立的工厂来创建IMessage个对象。

如果IMessage对象的创建需要一些通用逻辑,您可以将该逻辑放在一个单独的类中,并在工厂内使用它。

请记住,继承不适用于代码重用。