跳至主要內容

php设计模式

Moments大约 4 分钟

php设计模式


单例模式

特征:
某个类只能有一个实例;
它必须自行创建这个实例;
它必须自行向整个系统提供这个实例;
场景:
需要频繁实例化然后销毁的对象。
创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
有状态的工具类对象。
频繁访问数据库或文件的对象。
经典场景如:
应用配置,线程池,网站计数器,数据库连接池

工厂模式

工厂模式是我们常用的实例化对象模式,是用工厂方法代替new操作的一种模式。
意图:
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:
主要解决接口选择的问题。
何时使用:
我们明确地计划不同的条件下创建不同实例时。
如何解决:
让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:
创建过程在其子类执行。
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,便得系统中类的个数成倍增加。
在一定程序上增加了系统的复杂度,同时也增加了系统具体类的依赖。

观察者模式

观察者模式的定义:
在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
简而言之:
其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。
使用场景:
有一个微信公众号服务,不定时发布一些信息,关注公众号就可以收到推送信息,取消关注就收不到推送消息。

管道设计模式

所谓管道(Pipeline)设计模式,就是把数据传递给一个任务队列,由任务队列按次序依次对数据进行加工处理。
在laravel框架中,这里的数据就是http请求,任务队列包含了一个又一个的中间件。
Laravel中如何使用管道模式:
在Laravel框架中常见的中间件就是使用的管道模式。
当请求最终到达控制器动作被处理前,会先经过一系列的中间件。每个中间件都有一个独立的职责,如:
设置Cookie,判断是否登录,CSRF验证等。
每个阶段都会对请求进行处理,如果请求通过就会补传递给下一个处理,不通过就会返回相应的HTTP响应。
管道模式的优点:
1、将复杂的处理流程分解成独立的子任务,从页方便测试每个子任务。
2、将分解的子任务可以被不同的处理进程复用,避免代码冗余;
3、在复杂进程中添加、移除和修改任务非常轻松,对已存在的进程没有任何影响。
管理模式的缺点:
跃然每个子任务就得简单了,但是当你再度尝试将这些子任务组合成完整进程时有一定复杂性;
此外你还需要保证独立子任务测试通过后整体的流程能正常工作,这有一定的不确定性;
最后,当你看到的都是一个个子任务时,对理解整体流程带来困难。
如何使用Laravel管道:
首先创建一个新的Illuminate\Pipeline\Pipeline对象,并将其注入到某个Illuminate\Contracts\Container\Container的实例。
$pipeline - app('Illuminate\Pipeline\Pipeline");
接下来将你想要传递的对象发送到这个管道;
$pipeline->send($request);
然后将其传递到接受并处理请求的任务数组;
$pipeline->through($middleware);
最后运行管道任务并编写回调处理;
$pipeline->then(function($request){
    // Do something
});
这就是中间件的基本工作原理;
接收HTTP请求,让请求经过定义好的路由中间件,最后到达目的地
上次编辑于:
贡献者: Moments