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

未匹配的标注

对象池简单理解

对象池应用场景

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

例如:

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

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

为什么有开销较大的说法?

首先:
对象池服务可以减少从头创建每个对象的系统开销。

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

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

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

对象池特性

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

对象池实现原理

file

依赖注入简单理解

什么是依赖注入

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

例如:

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

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

举一个生活中的例子

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

依赖注入与对象池的区别

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

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
wangchunbo
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~