今天介绍对象池模式。这种设计模式在平时的工作中不像工厂模式那样被频繁使用,但是它提供了一种新的对象使用和管理思想,还是值得借鉴的。既然说到池,就是某种类型或者某种东西的集合,比如线程池,它涉及到将对象放入池中和从池中取出对象的过程。那我们先定义一个Art类:classArt{private$_name;/***@returnmixed*/publicfunctiongetName(){return$this->_name;}/***@parammixed$name*/publicfunctionsetName($name){$this->_name=$name;}}我们还需要定义一个对象池(ArtPool)来处理Art的入池和出池操作:classArtPool{//Artclassliststaticprivate$_arts=[];/***添加对象到对象池**@paramArt$art*/staticpublicfunctionpushArt(Art$art){if(!isset(static::$_arts[$art->getName()])||empty(static::$_arts[$art->getName()])){static::$_arts[$art->getName()]=$art;}}/***获取对象**@param$name*@returnmixed|null*/publicstaticfunctiongetArt($name){returnisset(self::$_arts[$name])?self::$_arts[$name]:null;}/***从对象池中移除对象**@param$name*/publicstaticfunctionremoveArt($name){if(array_key_exists($name,self::$_arts)){unset(self::$_arts[$name]);}}}这里有一个重要的地方需要注意,就是://artliststaticprivate$_arts=[];这个静态变量用来存放所有的Art对象;调用过程及执行结果:classClient{publicstaticfunctionmain(){$music=newArt();$music->setName('音乐');//添加到对象池ArtPool::pushArt($music);$电影=新艺术();$movie->setName('电影');ArtPool::pushArt($movie);$music_in_pool=ArtPool::getArt('音乐');p('$music_in_pool',$music_in_pool);$movie_in_pool=ArtPool::getArt('电影');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"}我们根据不同的名字获取未使用的Art对象,节省了new的时间内存和运行时间,主要适用于频繁创建和销毁对象的场景开头说了,对象池模式比较简单,但是为我们创建对象提供了一个有趣的思路。我们也可以在创建池对象时创建整个对象集合,这样也可以减少内存碎片,提高内存使用效率。
