共计 1570 个字符,预计需要花费 4 分钟才能阅读完成。
今天我们来介绍一下对象池模式,这种设计模式在平时的工作中使用频率不像工厂模式那样使用频繁,但是它提供了一种新的对象使用和管理思想,还是很值得借鉴的。
既然提到池了,那就是某一类或者一种事物的集合,比如线程池,这里面会涉及到把对象放到池子和从池子里面取对象的过程。
那我们先来定义一个 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 时候的内存和操作时间,主要适用于频繁创建对象和销毁对象的场景。
就像开始说,对象池模式相对比较简单,但是给我们提供了创建对象时一种比较有意思的思路。我们也可以在创建池对象的时候,就创建整个对象集合,这样还可以减少内存碎片,提高内存的使用效率。
正文完