代码之家  ›  专栏  ›  技术社区  ›  Sam Holder Brian Adams

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

  •  2
  • Sam Holder Brian Adams  · 技术社区  · 16 年前

    我有一个接口, 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 IMessageCreator .

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

    这看起来还好吗?有更好的解决办法吗?

    3 回复  |  直到 12 年前
        1
  •  5
  •   Reed Copsey    16 年前

    Factory method pattern . 如果您需要不同的参数来构造不同的类型,那么您就隐式地迫使调用者提前知道要构造什么类型。这完全消除了这种模式的好处。

    例如,如果要指定枚举(TypeA、TypeB、TypeC),那么最好直接构造TypeA。如果你想让多个子类实现TypeA,就为TypeA创建一个工厂。。。

        2
  •  0
  •   Andrey Tagaew    16 年前

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

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

        3
  •  0
  •   Paolo Capriotti    16 年前

    TypeXMessageCreator 类应该实现一个公共接口。我会摆脱 IMessageCreator 全部,只需创建4个独立的工厂 IMessage

    如果创造 I消息 对象需要一些公共逻辑,您可以将该逻辑放在一个单独的类中,并在工厂中使用它。

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