PHP 中常用的设计模式
创建型模式
单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式
结构型模式
适配器模式、组合模式、代理模式、外观模式、装饰器模式、桥接模式、享元模式
行为型模式
观察者模式、迭代子模式、策略模式、命令模式、模板方法模式、责任链模式、备忘录模式、状态模式、访问者模式、中介者模式、注册模式
单例模式
什么是单例模式?
单例模式通俗定义,一个类只有一个实例。而且是内部自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是返回单例类内部存储的实例一个引用。
上面的代码用静态变量 实现了单例模式和创建单例的静态方法 getInstance(). 请注意以下几点:
构造函数 __construct() 被声明为 protected 是为了防止用 new 操作符在这个类之外创建新的实例。
魔术方法 __clone() 被声明为 private 是为了防止用 clone 操作符克隆出新的实例.
魔术方法 __wakeup() 被声明为 private 是为了防止通过全局函数 unserialize() 反序列化这个类的实例。
新的实例是用过静态方法 getInstance() 使用后期静态绑定生成的。这允许我们对 Singleton 类进行继承,并且在取得 SingletonChild 的单例时不会出现问题。
单例模式是非常有用的,特别是我们需要确保在整个请求的声明周期内只有一个实例存在。典型的应用场景是,当我们有一个全局的对象(比如配置类)或一个共享的资源(比如事件队列)时。
你应该非常小心地使用单例模式,因为它非常自然地引入了全局状态到你的应用中,降低了可测试性。 在大多数情况下,依赖注入可以(并且应该)代替单例类。 使用依赖注入意味着我们不会在设计应用时引入不必要的耦合,因为对象使用共享的或全局的资源,不再需要耦合具体的类。
策略模式
什么是策略模式?
定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化不会影响到使用算法的用户。使用策略模式可以实现 Ioc、依赖倒置、控制反转
观察者模式
什么是观察者模式?定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
应用场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主体的代码。
Observer.php 中
调用观察者
工厂模式
什么是工厂模式?工厂方法或者类生成对象,而不是在代码中直接 new,好处在于改动一个类的名称或者参数时,只需要改动一个地方
外部调用时
注册树模式
什么是注册树模式?解决全局共享和交换对象
可以放在工厂文件中之后再在其他地方调用
适配器模式
什么是适配器模式?
适配器模式,可以将截然不同的函数接口封装成统一的 API;
实际应用举例,PHP 的数据库操作有 mysql,mysqli,pdo 3 种,可以用适配器模式统一成一致。类似的场景还有 cache 适配器,将 memcache,redis,file,apc 等不同的缓存函数,统一成一致。
IMooc\Database\PDO.php 文件中
调用
数据对象映射模式
什么是数据对象映射模式?
数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作。
调用
原型模式
什么是原型模式?
与工厂模式作用类似,都是用来创建对象。
与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过 clone 原型对象来创建新的对象。这样就免去了类创建时重复的初始化操作。
原型模式适用于大对象的创建。创建一个大对象需要很大的开销,如果每次 new 就会消耗很大,原型模式仅需内存拷贝即可。
传统写法
使用原型模式
装饰器模式
装饰器模式(Decorator),可以动态地添加修改类的功能。
一个类提供了一项功能,如果要在修改并添加额外的功能,传统的编程模式,需要写一个子类继承它,并重新实现类的方法。
使用装饰器模式,仅需要在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性。
IMooc\Canvas.php
IMooc\DrawDecorator.php
IMooc\ColorDrawDecorator.php
IMooc\SizeDrawDecorator.php
调用
迭代器模式
迭代器模式,在不需要了解内部实现的前提下,遍历一个聚合对象的内部元素。
相比于传统的编程模式,迭代器模式可以隐藏遍历元素的所需的操作。
IMooc\AllUser.php
调用
代理模式
在客户端与实体之间建立一个代理对象 (proxy),客户端对实体进行操作全部委派给代理对象,隐藏实体的具体实现细节。
proxy 还可以与业务代码分离,部署到另外的服务器。业务代码中通过 RPC 来委派任务。
IMooc\Proxy.php
IMooc\IUserProxy.php
调用
版权声明: 本文为 InfoQ 作者【左诗右码】的原创文章。
原文链接:【http://xie.infoq.cn/article/4a5f872a18cfadf9c6ef5fb80】。文章转载请联系作者。
评论