Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在这种情况下创建工厂的最佳实践_Java_Design Patterns - Fatal编程技术网

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

Java 在这种情况下创建工厂的最佳实践,java,design-patterns,Java,Design Patterns,我正在使用一个API——向德鲁伊发送消息 查看文档和示例代码,看起来发送方是异步的,线程安全的 下面是来自API的示例 我的问题是,当我必须创建具有不同配置的多个发送器并能够重用它们时,要应用什么样的设计/模式 发件人每秒能够发送超过100k条消息,因此我不想重新加载发件人的配置 我的想法是创建一个发送者工厂,根据消息类型获取特定的发送者并发送消息 想法?这不是一个真正可以回答的问题(例如最佳实践),可能更适合 然而,我很无聊,所以这里有一个意识流的答案: 你所描述的听起来更像是一个“缓存”或“

我正在使用一个API——向德鲁伊发送消息

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

下面是来自API的示例

我的问题是,当我必须创建具有不同配置的多个发送器并能够重用它们时,要应用什么样的设计/模式

发件人每秒能够发送超过100k条消息,因此我不想重新加载发件人的配置

我的想法是创建一个发送者工厂,根据消息类型获取特定的发送者并发送消息


想法?

这不是一个真正可以回答的问题(例如最佳实践),可能更适合

然而,我很无聊,所以这里有一个意识流的答案:

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

如果是这样的话,我会说您已经创建了一个“发送者池”或“发送者缓存”。当然,此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;
}
因此,我会说您使用的是工厂,在上下文中这样做似乎是有效的,但从更大的角度来看,我会说您使用的是缓存/池来解决问题。虽然游泳池也是一种工厂。设计模式中使用的词语非常模糊

它在概念上似乎与“”非常相似。也许你可以这样描述:

一种消息路由器,它根据消息类型选择合适的发送者工厂

而且

一个发送者池,用于缓存已创建的发送者以供重用

而且

为给定邮件类型创建发件人的发件人工厂

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

例如,路由器和缓存可以组合在一起,以便路由器具有
映射
。如果每种邮件类型只需要一个发件人,这就足够了

或者,如果您可能选择使用不同的发送方,因为发送方当前正忙或已签出(类似于线程池或连接池的工作方式),那么您可能需要一个或多个专用于实现该池的类,最终可能会得到类似于
Map

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