在一些项目架构当中,当我们需要实例化一大堆的类,比如 a/b/c/d/e/f/g…等等,那么代码变得很冗余,那么有没有一种方法,能够去避免这种方法呢?(其实是因为懒)
下面讲解的是一种能够解决这种情况的设计模式。对象池模式(又叫注册树模式) :
对象池模式(The Object Pool Pattern)是单例模式的一个变种,它提供了获取一系列相同对象实例的入口。当你需要对象来代表一组可替代资源的时候就变的很有用,每个对象每次可以被一个组件使用。
<?php
class demo{
public function get(){
return '我是demo';
}
}
class Objpool{
private static $pool;
public static function set($key,$value){
self::$pool[$key] = $value;
}
public static function get($key){
if (empty(self::$pool[$key])){
self::$pool[$key] = new $key;
}
return self::$pool[$key];
}
public static function _unset($key){
if (empty(self::$pool[$key])){
return new Exception("对象池中不存在该对象");
}
unset(self::$pool[$key]);
}
function __autoload(){
return new Exception("未找到该对象");
}
}
//挂载demo类到对象池中
$obj = Objpool::get('demo')->get();
var_dump($obj);
对象池模式的优点:
- 复用池中对象,消除创建对象、回收对象 所产生的内存开销、cpu开销以及(若跨网络)产生的网络开销.
对象池模式的缺点:
- 由于池中对象的数量有限, 势必成为一个可伸缩性瓶颈;
- 很难正确的设定对象池的大小, 如果太小则起不到作用, 如果过大, 则占用内存资源高
总结:
对象池模式经常用在频繁创建、销毁对象(并且对象创建、销毁开销很大)的场景,比如数据库连接池、线程池、任务队列池等。 而使用对象池模式的最大好处,就是不用频繁去实例化对象,在一些框架中,服务容器的结构就跟对象池模式非常相像