1

我必须创建一组将由同一个客户端使用的对象类型。我正在考虑应用工厂模式。但我是这种设计模式的新手,想从你们中的一些人那里得到建议。

我有 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.

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

4

2 回答 2

1

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

如果您要将抽象描述转换为具体表示,则构建器很有用。通常的例子是一个结构化的文档,它可以被描述为诸如 Headline-level-1:“我是标题”,base-text:“我是内容。这里有几行”这样的元素。这可以转换为几种具体的渲染,例如 HTML、RTF、PDF...

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

于 2012-12-10T11:15:13.103 回答
1

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

我认为您需要的是完全不同的抽象工厂模式。在这种情况下,每个 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。

于 2012-12-10T10:41:24.097 回答