2

我有一个接口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)    
}

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

interface IMessageCreator
{
     IMessage Create(MessageParams params);
}

所以我有 4 个实现IMessageCreatorTypeAMessageCreator, TypeBMessageCreator, TypeCMessageCreator,TypeDMessageCreator

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

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

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

4

3 回答 3

5

这确实违反了工厂方法模式的精神。如果你需要不同的参数来构造你的不同类型,你就隐含地强制调用者提前知道正在构造什么类型。这完全消除了这种模式的好处。

例如,如果您要指定一个枚举(TypeA、TypeB、TypeC),那么您不妨直接构造 TypeA。如果要允许多个子类实现 TypeA,请为 TypeA 创建一个工厂...

于 2010-04-02T16:13:24.807 回答
0

在我看来,拥有四个 IMessage Create 重载比使用一个带有 MessageParam 的方法要好得多。

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

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

于 2010-04-02T16:11:32.380 回答
0

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

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

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

于 2010-04-02T16:14:25.387 回答