我必须创建一组将由同一客户端使用的对象类型。我正在考虑应用工厂模式。但我对这种设计模式不熟悉,并希望得到你们中的一些人的建议。
我有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.
您能否建议我如何将工厂设计模式应用于创建这些对象?
答案 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的简化版本。