今天咱们来介绍一下对象池模式,这种设计模式在平时的工做中使用频率不像工厂模式那样使用频繁,可是它提供了一种新的对象使用和管理思想,仍是很值得借鉴的。设计模式
既然提到池了,那就是某一类或者一种事物的集合,好比线程池,这里面会涉及到把对象放到池子和从池子里面取对象的过程。this
那咱们先来定义一个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]); } } }
这里面有个比较重要的地方须要注意一下,就是:code
//艺术类列表 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); } }
执行结果:rem
******* $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 时候的内存和操做时间,主要适用于频繁建立对象和销毁对象的场景。get
就像开始说,对象池模式相对比较简单,可是给咱们提供了建立对象时一种比较有意思的思路。咱们也能够在建立池对象的时候,就建立整个对象集合,这样还能够减小内存碎片,提升内存的使用效率。string