乐趣区

设计模式对象池模式

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

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

那我们先来定义一个 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 时候的内存和操作时间,主要适用于频繁创建对象和销毁对象的场景。

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

退出移动版