如何改善工厂模式

时间:2012-12-10 09:38:15

标签: design-patterns c#-2.0

我必须创建一组将由同一客户端使用的对象类型。我正在考虑应用工厂模式。但我对这种设计模式不熟悉,并希望得到你们中的一些人的建议。

我有MessageTypeA,MessageTypeB和MessageType C.每种消息类型可以是XML格式或普通纯文本。每种消息类型也可以有1个或更多版本。 例如,

MessageType A in xml format version 1,
MessageType A in xml format version 2,
MessageType A in xml format version 3.

MessageType A in plain text format version 1,
MessageType A in plain text format version 2,
MessageType A in plain text format version 3.

MessageType B in xml format version 1,
MessageType B in xml format version 2,
MessageType B in xml format version 3.

MessageType B in plain text format version 1,
MessageType B in plain text format version 2,
MessageType B in plain text format version 3.

您能否建议我如何将工厂设计模式应用于创建这些对象?

2 个答案:

答案 0 :(得分:1)

首先没有“工厂”模式,已知模式是Factory Method Pattern。此模式允许您为每个Factory方法实例创建一种类型的对象,然后传递抽象基础Factory方法并调用单一创建方法来实例化它创建的任何内容。

我认为你所需要的是Abstract Factory Pattern,它完全是一种完全不同的动物。在这种情况下,每个Factory实例创建一个相互关联的对象的族。在你的具体情况下,我会像这样建模(伪代码):

// Base abstract Abstract Factory
abstract class MessageAF {
   MsgType createMessageTypeA();  
   MsgType createMessageTypeB();  
   MsgType createMessageTypeC();  
}

// concrete implementation
class XmlFormatVersion1AF extends MessageAF {
   MsgType createMessageTypeA();  
   MsgType createMessageTypeB();  
   MsgType createMessageTypeC();  
}

// concrete implementation
class XmlFormatVersion2AF extends MessageAF {
   MsgType createMessageTypeA();  
   MsgType createMessageTypeB();  
   MsgType createMessageTypeC();  
}

// concrete implementation
class PlainTextFormatVersion1AF extends MessageAF {
   MsgType createMessageTypeA();  
   MsgType createMessageTypeB();  
   MsgType createMessageTypeC();  
}

然后在您的代码库中,您主要依赖于类型MessageAF并在每种情况下传递适当的实例实现,例如PlainTextFormatVersion1AF创建纯文本消息版本1.

答案 1 :(得分:1)

您可能对上述工厂方法设计模式和“Builder”模式感兴趣。

如果要将抽象描述转换为具体表示,

Builder非常有用。通常的例子是一个结构化的文档,可以描述为标题级别1之类的元素:“我是标题”,基本文本:“我是内容。几行都在这里”。这可以转换为几个具体的渲染,如HTML,RTF,PDF ......

如果您的消息比Giovanni的答案中描述的相对简单的消息系列更适合该模型,您可能会发现该模式的用途。事实上,在我看来,他的解决方案是Builder的简化版本。

相关问题