今天我们来介绍一下对象池模式,这种设计模式在平时的工作中使用频率不像工厂模式那样使用频繁,但是它提供了一种新的对象使用和管理思想,还是很值得借鉴的。

既然提到池了,那就是某一类或者一种事物的集合,比如线程池,这里面会涉及到把对象放到池子和从池子里面取对象的过程。

那我们先来定义一个Art类:

class Art{    private $_name;        /**     * @return mixed     */    public function getName()    {        return $this->_name;    }        /**     * @param mixed $name     */    public function setName($name)    {        $this->_name = $name;    }}

我们还需要定义一个对象池(ArtPool),来处理Art的入池和出池操作:

class ArtPool{    //艺术类列表    static private $_arts = [];        /**     * 对象池中加入对象     *     * @param Art $art     */    static public function pushArt(Art $art)    {        if(!isset(static::$_arts[$art->getName()]) || empty(static::$_arts[$art->getName()]))        {            static::$_arts[$art->getName()] = $art;        }    }        /**     * 获取对象     *     * @param $name     * @return mixed|null     */    public static function getArt($name)    {        return isset(self::$_arts[$name]) ? self::$_arts[$name] : null;    }        /**     * 从对象池中删除对象     *     * @param $name     */    public static function removeArt($name)    {        if(array_key_exists($name, self::$_arts))        {            unset(self::$_arts[$name]);        }    }}

这里面有个比较重要的地方需要注意一下,就是:

//艺术类列表static private $_arts = [];

这个静态变量来存储所有的Art对象;

调用过程和执行结果:

class Client{    public static function main()    {        $music = new Art();                $music->setName('music');                //加入到对象池中        ArtPool::pushArt($music);            $movie = new Art();                $movie->setName('movie');        ArtPool::pushArt($movie);            $music_in_pool = ArtPool::getArt('music');                p('$music_in_pool',$music_in_pool);                $movie_in_pool = ArtPool::getArt('movie');                p('$movie_in_pool',$movie_in_pool);    }}

执行结果:

*******$music_in_pool=object(Art)#2 (1) {  ["_name":"Art":private]=>  string(5) "music"}*******$movie_in_pool=object(Art)#3 (1) {  ["_name":"Art":private]=>  string(5) "movie"}

我们根据不同的name来获取不用的Art对象,这样节省了new 时候的内存和操作时间,主要适用于频繁创建对象和销毁对象的场景。

就像开始说,对象池模式相对比较简单,但是给我们提供了创建对象时一种比较有意思的思路。我们也可以在创建池对象的时候,就创建整个对象集合,这样还可以减少内存碎片,提高内存的使用效率。