0

一些面向对象的设计出现在我的脑海中。它就像一个游泳池和一个工厂。

工厂创建可以在多个线程之间共享的资源。一个资源实体很昂贵,并且它的创建需要很多时间。一个资源可以同时被多个线程使用。

在我的特定情况下,资源是 SSH 连接。SSH 连接使用一个 TCP 套接字。但是一个 SSH 连接可以有多个会话。每个线程都为自己创建新会话。会话创建不需要与工厂一起工作。

多个线程可以尝试与同一个远程主机进行交互。

我为资源定义了状态:

初始化一些线程试图获得 SSH 连接,但它不存在。资源创造的过程很漫长。如果另一个线程也将尝试获取相同的资源,它会得到所需的资源正在进行中,并且第二个线程去等待通知。

free 所有会话都关闭并且没有线程使用 SSH 连接

忙 至少一个线程已经建立了 SSH 连接

关闭的 tcp 套接字被破坏

有一个资源的状态图:

  • -> 初始化 -> 忙碌 -> 空闲 -> 关闭

    空闲->忙

我阅读了有关 OOP 模式、企业应用程序模式、并发模式的书籍,但我不记得我上面描述的情况。

SSH 只是一个例子。这种模式适用于任何支持并发工作的繁重资源。当第二个线程想要创建资源但创建资源的第二个实例是无意义的。

如果是图案,那他叫什么名字?我相信这个设计已经在某个地方描述过了。

4

1 回答 1

0

据我所知,您必须解决“连接池”的问题。连接池是“池模式”的一种实现。

与模式(我所看到的)不同的是,在您的实现中,会话的用户对连接和池化的东西的处理有所了解。

对我来说,如果用户从会话池中订购一个会话并将其返回给它,则似乎是一种更“模式方式”。因此池系统知道是否需要连接,并且创建/销毁机制对用户是透明的。用户获得“连接”是因为他有一个会话。

会话创建不需要与工厂一起工作。

这可能是真的,但会话的生命周期对于连接的生命周期至关重要。因此,我将负责创建/销毁池而不是使用对象。

于 2012-10-10T07:11:38.223 回答