设计模式の创建型の原型模式

简介

对象池(也称为资源池)被用来管理对象缓存。对象池是一组已经初始化过且可以直接使用的对象集合,用户在使用对象时可以从对象池中获取对象,对其进行操作处理,并在不需要时归还给对象池而非销毁它。

若对象初始化、实例化的代价高,且需要经常实例化,但每次实例化的数量较少的情况下,使用对象池可以获得显著的性能提升。常见的使用对象池模式的技术包括线程池、数据库连接池、任务队列池、图片资源对象池等。

当然,如果要实例化的对象较小,不需要多少资源开销,就没有必要使用对象池模式了,这非但不会提升性能,反而浪费内存空间,甚至降低性能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class ObjectPool
{
private $instances = [];

public function get($key)
{
if (isset($this->instances[ $key ]))
{
return $this->instances[ $key ];
} else
{
$item = $this->make($key);
$this->instances[ $key ] = $item;

return $item;
}
}

public function add($object, $key)
{
$this->instances[ $key ] = $object;
}

public function make($key)
{
if ($key == 'mysql')
{
return new Mysql();
} elseif ($key == 'socket')
{
return new Socket();
}
}
}

class ReusableObject
{
public function doSomething()
{
// ...
}
}

说明

上面的例子其实只是一个最基础的例子,对象池的理念还有很多的升级版本,像对象个数的控制,就有动态扩展容器对象的做法,也有静态固定的做法,还有初始化和静态固定之间浮动的做法。所有的线程池之类的概念,其实都是设计模式的对象池的思想。