PHP 设计模式答疑-对象池与依赖注入的区别

对象池简单理解
对象池应用场景
对像池主在对象创建开销较大或要控制对象数量的时候使用。最常见的对象池应该是数据库连接池和线程池。

例如:

程序需要数据库连接时从连接池中取一个(连接池里有多个连接),用完了不是关闭连接而是把连接放回连接池给其他程序使用。

一个对像池通常只放同一类的对象。

为什么有开销较大的说法?
首先:
对象池服务可以减少从头创建每个对象的系统开销。

在需要对象时从池中提取,在使用完对象时,把它放回池中,等待下一个请求。对象池使你能够控制所使用的对象数量。

在 PHP 的长驻进程模式下,对象池尤其重要.

由于 PHP 的 GC 缺陷,在高并发下,PHP 常驻进程内直接通过 new 创建对象,会导致 PHP 进程占用大量的内存,而且很容易出现 OOM(out of memory)。

对象池特性
创建固定数量的对象;
需要时从池中提取,不需要时归还池中;
自动归还对象;
根据有效期和使用次数淘汰对象
对象池实现原理

依赖注入简单理解
什么是依赖注入
依赖注入,是指对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。

例如:

A 对象需要引用 B 对象的话,可以在 A 的构造函数里面将 B 传递进去,或者调用 A 的某个 set 方法。

通俗一点就是已经 new 好了, 要用直接取拿。

举一个生活中的例子
依赖注入 (DI) 和控制反转 (IOC) 是从不同的角度的描述的同一件事情,就是指通过引入 IOC 容器,利用依赖关系注入的方式,实现对象之间的解耦。
我们举一个生活中的例子,来帮助理解依赖注入的过程。大家对 USB 接口和 USB 设备应该都很熟悉吧,USB 为我们使用电脑提供了很大的方便,现在有很多的外部设备都支持 USB 接口。
现在,我们利用电脑主机和 USB 接口来实现一个任务:从外部 USB 设备读取一个文件。
电脑主机读取文件的时候,它一点也不会关心 USB 接口上连接的是什么外部设备,而且它确实也无须知道。它的任务就是读取 USB 接口,挂接的外部设备只要符合 USB 接口标准即可。所以,如果我给电脑主机连接上一个 U 盘,那么主机就从 U 盘上读取文件;如果我给电脑主机连接上一个外置硬盘,那么电脑主机就从外置硬盘上读取文件。挂接外部设备的权力由我作主,即控制权归我,至于 USB 接口挂接的是什么设备,电脑主机是决定不了,它只能被动的接受。电脑主机需要外部设备的时候,根本不用它告诉我,我就会主动帮它挂上它想要的外部设备,你看我的服务是多么的到位。这就是我们生活中常见的一个依赖注入的例子。在这个过程中,我就起到了 IOC 容器的作用。
通过这个例子,依赖注入的思路已经非常清楚:当电脑主机读取文件的时候,我就把它所要依赖的外部设备,帮他挂接上。整个外部设备注入的过程和一个被依赖的对象在系统运行时被注入另外一个对象内部的过程完全一样。

依赖注入与对象池的区别
都是节约开销。
都是拿来就用,不需要自己 new
对象池,不用了,放回去,会自动归还和淘汰对象
依赖注入,是用的时候主动帮你挂上你要的依赖。没归还和自动淘汰这一说
一个对像池通常只放同一类的对象。

————————————————
原文作者:wangchunbo
转自链接:博客:PHP 设计模式答疑-对象池与依赖注入的区别
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!