0

如果我使用对象池设计模式,我是否必须在任何人需要它们之前创建对象,或者我只能在有人需要时创建每个对象,然后(在他使用它之后)将它放入池中?因此,从一个空池开始,然后随着时间的推移填充它,并且仅在有人需要使用它们并且它们当前不在池中时才创建对象?

4

3 回答 3

0

来自维基

对象池模式是一种软件创建设计模式,它使用一组随时可用的已初始化对象——“池”——而不是按需分配和销毁它们。

因此,这种模式的主要思想是在创建和初始化类实例的成本很高的情况下以及在按需实例化对象效率较低的其他情况下预先创建对象池。

于 2020-08-02T10:06:15.200 回答
0

对象池模式的主要目标是最小化昂贵实例的性能成本。昂贵可能意味着:使用/阻止有价值的资源或实例化/配置/初始化耗时。通过重用实例,您可以避免过度实例化并能够管理有限的资源。

最著名的例子是线程池。许多语言使用它来提高线程性能。尽管线程用于通过并行化操作或任务来提高性能,但线程本身的创建成本非常高。线程在操作系统级别进行管理。必须分配额外的内存,并且必须复制执行代码和所有引用的资源。必须创建像调用堆栈这样的新线程上下文并初始化指令指针......
重用以前使用的线程要便宜得多。

这个成本也是你不会盲目提前填满池子的原因。如果您不知道是否最终使用了池中的任何对象,您将按需创建对象。如果您知道池中的对象很可能会被使用,您可以使用对象初始化池。根据上下文,您要么将池填充到其容量,要么仅填充到某个对象计数并按需生成更多。

高效的池实现具有最小和最大限制,并被实现为池对象队列。根据上下文,您还可以添加第二个队列来将任务或请求排入队列,以防所有池对象都在使用中。有不同的算法来处理资源请求,例如使用优先级队列或循环。

由于您希望防止池的客户端挨饿,并且使用池的主要目标是使用智能对象实例管理来提高性能,因此对象池模式仅在实例使用时间很短的情况下才有意义。否则最好直接创建实例(如果资源不受限制)。

于 2020-08-04T12:24:48.030 回答
0

这两种方法都是设计模式的有效实现。您可以选择预先或根据需要填充池,具体取决于要求。

对象池的一个常见用例是线程。在 Java 中,我们可以看到Cached ThreadPool 与 Fixed ThreadPool中实现的两种方法。缓存版本按需创建线程;固定版本提前创建线程。

于 2020-08-02T12:38:59.093 回答