单例模式 Singleton

目的

在应用程序调用的时候,只能获得一个对象实例。

应用场景

  • 数据库连接
  • 日志 (多种不同用途的日志也可能会成为多例模式)

UML图

Singleton

特点

  • 单例类不能直接实例化创建,而是只能由类本身实例化。因此,要获得这样的限制效果,构造函数必须标记为private,从而防止类被实例化。
  • 需要一个私有静态成员变量来保存类实例。
  • 公开一个能访问到实例的公开静态方法。
  • 在PHP中,为了防止他人对单例类实例克隆,通常还为其提供一个空的私有__clone()方法。

简单工厂模式 SimpleFactory

目的

简单工厂模式是一个精简版的工厂模式。它与静态工厂模式最大的区别是它不是『静态』的。因为非静态,所以你可以拥有多个不同参数的工厂,你可以为其创建子类。甚至可以模拟(Mock)他,这对编写可测试的代码来讲至关重要。
这也是它比静态工厂模式受欢迎的原因!

UML图

SimpleFactory

工厂方法模式 Factory

目的

对比简单工厂模式的优点是,您可以将其子类用不同的方法来创建一个对象。举一个简单的例子,这个抽象类可能只是一个接口。这种模式是「真正」的设计模式, 因为他实现了 S.O.L.I.D 原则中「D」的
「依赖倒置」。这意味着工厂方法模式取决于抽象类,而不是具体的类。 这是与简单工厂模式和静态工厂模式相比的优势。

UML图

Factory

抽象工厂模式 AbstractFactory

目的

在不指定具体类的情况下创建一系列相关或依赖对象。 通常创建的类都实现相同的接口。 抽象工厂的客户并不关心这些对象是如何创建的,它只是知道它们是如何一起运行的。

UML图

AbstractFactory

建造者模式 Builder

目的

建造者是创建一个复杂对象的一部分接口。有时候,如果建造者对他所创建的东西拥有较好的知识储备,这个接口就可能成为一个有默认方法的抽象类(又称为适配器)。如果对象有复杂的继承树,那么对于建造者来说,有一个复杂继承树也是符合逻辑的。
注意:建造者通常有一个「流式接口」,例如 PHPUnit 模拟生成器。

应用场景

  • PHPUnit: 模拟生成器

UML图

Builder

原型模式 Prototype

目的

相比正常创建一个对象 (new Foo () ),首先创建一个原型,然后克隆它会更节省开销。

应用场景

  • 大数据量 (例如:通过 ORM 模型一次性往数据库插入 1,000,000 条数据)

UML图

Prototype