三种工厂模式对比

例子来自<大话设计模式>一书,php代码由个人实现

简单工厂模式:

  • 一个抽象产品类(可以是:接口,抽象类,普通类),可以派生出多个具体产品类。

  • 单独一个具体的工厂类。

  • 每个具体工厂类只能创建一个具体产品类的实例。

工厂方法模式:

  • 一个抽象产品类(可以是:接口,抽象类,普通类),可以派生出多个具体产品类。

  • 一个抽象工厂类(可以是:接口,抽象类),可以派生出多个具体工厂类。

  • 每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:

  • 多个抽象产品类(可以是:接口,抽象类,普通类),每个抽象产品类可以派生出多个具体产品类。

  • 一个抽象工厂类(可以是:接口,抽象类),可以派生出多个具体工厂类。

  • 每个具体工厂类可以创建多个具体产品类的实例。

区别:

  • 简单工厂模式只有一个抽象产品类,只有一个具体的工厂类。

  • 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类。

  • 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个具体产品类的实例。

简单工厂模式

UML类图如下:

当需要加法类的时候,调用工厂类的CreateOperate(),要指定制造的Product

调用工厂,需要createOperator("/"),就能返回除法运算符。

  • 优点:客户端不需要修改代码。

  • 缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。

简单工厂模式程序设计图:

具体实现:

1)抽象产品(Product)角色:运算抽象类(Operation)。

2)具体产品(Concrete Product)角色:加法运算(OperationAdd),减法运算(OperationSub),乘法运算(OperationMul),除法运算(OperationDiv)。

3)工厂(Creator)角色:工厂类(OperationFactory)。

工厂方法模式

UML类图如下:

这个和简单工厂有区别,简单工厂模式只有一个工厂,工厂方法模式对每一个产品都有相应的工厂

  • 好处:增加一个运算类(例如N次方类),只需要增加运算类和相对应的工厂,两个类,不需要修改工厂类。

  • 缺点:增加运算类,会修改客户端代码,工厂方法只是把简单工厂的内部逻辑判断移到了客户端进行。

改造简单工厂代码中的工厂(Creator)角色,代码如下:

抽象工厂模式:

UML类图如下:

Last updated

Was this helpful?