实现一个对象池模式(注册树)

    在一些项目架构当中,当我们需要实例化一大堆的类,比如 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开销以及(若跨网络)产生的网络开销.

对象池模式的缺点:

  • 由于池中对象的数量有限, 势必成为一个可伸缩性瓶颈;
  • 很难正确的设定对象池的大小, 如果太小则起不到作用, 如果过大, 则占用内存资源高

总结:
    对象池模式经常用在频繁创建、销毁对象(并且对象创建、销毁开销很大)的场景,比如数据库连接池、线程池、任务队列池等。 而使用对象池模式的最大好处,就是不用频繁去实例化对象,在一些框架中,服务容器的结构就跟对象池模式非常相像

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值