在这种情况下创建工厂的最佳实践

时间:2016-05-04 21:35:05

标签: java design-patterns

我正在使用API​​ - Tranquility - 向德鲁伊发送消息。

查看文档和示例代码,看起来发送方是异步的并且线程安全。

以下是API中的Java Example

我的问题是关于在我必须创建具有不同配置的多个发件人并能够重用它们时应用的设计/模式。

发件人每秒能够发送超过10万条消息,因此我不想为发件人重新加载配置。

我的想法是创建一个发件人工厂,根据邮件类型获取特定发件人并发送邮件。

思想?

1 个答案:

答案 0 :(得分:0)

这不是一个真正的问题(例如最佳做法),可能更适合http://programmers.stackexchange.com

但是,我很无聊,所以这里有一条意识流回答:

您所描述的内容听起来更像是“缓存”或“池”,而不仅仅是工厂。逻辑基本上如下(我不知道安宁,所以这只是伪代码)?

public void onMessage(Message message) {
    Sender sender = pool.findOrCreateSenderForMessageType(message.getType());
    sender.send(message);
}

如果是,那么我会说你创建了一个“发送者池”或“发送者缓存”。当然,这个findOrCreateSenderForMessageType需要引用工厂......

public Sender pool.findOrCreateSenderForMessageType(MessageType type) {
    Sender sender = cache.findByType(type);
    if(sender == null) {
        sender = factory.createSender(type);
        cache.addSenderForType(sender, type);
    }
    return sender;
}

所以我会说你正在使用一个工厂,在上下文中这样做似乎是有效的但是在更大的图片中我会说你正在使用缓存/池来解决问题。虽然游泳池也是一种工厂。设计模式中使用的词语是如此模糊。

在概念上似乎与“routing data source”非常相似。所以也许你可以把它形容为:

A message router which chooses an appropriate sender factory based on the message type

和...

A sender pool which caches created senders for reuse

和...

A sender factory which creates a sender for a given message type

这三个概念可以表示为三个不同的类,或者所有三个概念可以组合在一个类中。

例如,可以组合路由器和缓存,以便路由器具有Map<MessageType, Sender>。如果您每种消息类型只需要一个发件人,那就足够了。

或者,如果您可能选择使用其他发件人,因为发件人当前正忙或签出(类似于线程池或连接池的工作方式),那么您可能需要一个或多个专用于实现池的类和你可能会得到像Map<MessageType, SenderFactory>

这样的东西