PHP 常用设计模式

其实设计模式是通用的,不只是限定于 PHP 语言,但是这里使用 PHP 来举例。

工厂模式

使用工厂方法来生成对象,避免了new Class()这种方式,其好处在于如果__construct()的参数变化的话,只需要修改工厂方法而不需要到每个调用的地方去修改。

 

单例模式

使每个类只允许被实例化一次,例如数据库的连接,就只需要连接一次。

此模式有三个特点:

  1. 一个类只能有一个实例;
  2. 这个实例必须由类本身来创建;
  3. 必须有一个接口使得这个实例能够被系统获取;

图为单例模式简单实现,但是其实还要防止newclone

 

 

适配器模式

此模式其实是对原有类的一种拓展方式,其实用语言很难表述,Talk is cheap, show me the code.

 

 

 

观察者模式

当一个对象更新时,依赖它的对象不会收到通知,而是自动更新。

将每个依赖类中定义一个update()方法,当更新时自动调用所有已注册的观察者对象的update(),达到自动更新的目的。

 

 

原型模式

此模式适用于创建大对象,它是将创建对象时的 new 操作改为了两个对象之间的 clone 操作,节省了创建开销,而只需要内存拷贝,然而其缺点也很明确,就是每个类都需要有一个拷贝函数。如果是一个全新的类,实现此模式非常简单,而如果是对原有的代码进行重构时,实现起来会非常复杂。

提到拷贝,此处就有一个深拷贝和浅拷贝的问题了。

浅拷贝指的是对象中所有的变量都拥有和原来对象一样的值,包括对其他对象的引用也仍旧指向原来的对象。

深拷贝做了浅拷贝完成的事之外,还将被引用的对象也拷贝了一份,拷贝被引用对象的行为称为间接拷贝。

 

装饰器模式

传统的模式中,如果要在一个类的基础上拓展实现新的功能,需要用子类继承并重新实现。

而在此模式下,只需要在运行的时候添加一个装饰器对象即可。

装饰模式中的主要角色有:

  1. 抽象主题;
  2. 抽象观察者;
  3. 具体主题;
  4. 具体观察者;

模式优点在于比传统的继承更加灵活,但是会产生更多的对象,消耗内存。

 

迭代器模式

在黑盒情况下,遍历一个对象的内部元素。

主要目的在于允许外部访问一个聚合对象的内部内容而无需暴露它的内部表示,可以支持对聚合对象的多种遍历,为不同结构的聚合对象提供一个统一的遍历接口。

 

代理模式

在客户端与实体之间建立一个代理对象,以隐藏实体的具体实现细节。

代理模式最大的好处在于实现了逻辑也实现了解耦。

代理可以分为:

  1. 保护代理;
  2. 远程代理;
  3. 虚代理;
  4. 智能指引;

视情况而选择。

共有 1 条评论

  1. 加气块设备

    都是需要的东西 博主太给力了 必须收藏

Top