为什么需要抽象工厂模式

是对工厂方法模式的继续优化。

代码

先抽象出来一个工厂接口:
image.png

苹果工厂和梨子工厂都实现该接口:
image.png
利用多态,接口引用指向具体类的对象,统一作为IFactory对象来使用,如下:
image.png

优点

  • 符合单一原则,一个工厂只生产一种产品;
  • 符合开闭原则,如果要生产新的产品,加一个工厂;
  • 通过抽象出工厂接口,客户端只用和IFactory打交道了,那么代码替换起来就变容易了:

例如:
image.png
要替换成梨子,只需要改一行代码:
image.png
更好的例子,比如将程序中的SQL Server数据库全部替换成Access数据库,使用抽象方法的话,只需要在IFactory中定好增删改查4个方法,让SQLFactory和AccessFactory实现此接口,调用时直接使用IFactory的抽象方法即可,调用者无需知道使用的是什么数据库,我们可以很方便的替换整个程序的数据库,并且客户端毫不知情。

缺点

太重了,如果IFactory需要新增功能,会影响到所有的具体的工厂子类(要实现抽象工厂的方法)。所以抽象工厂方法适用于增加同类工厂这样的横向扩展需求,不适合新增功能这样的纵向扩展。