为什么需要抽象工厂模式
是对工厂方法模式的继续优化。
代码
先抽象出来一个工厂接口:
苹果工厂和梨子工厂都实现该接口:
利用多态,接口引用指向具体类的对象,统一作为IFactory对象来使用,如下:
优点
- 符合单一原则,一个工厂只生产一种产品;
- 符合开闭原则,如果要生产新的产品,加一个工厂;
- 通过抽象出工厂接口,客户端只用和IFactory打交道了,那么代码替换起来就变容易了:
例如:
要替换成梨子,只需要改一行代码:
更好的例子,比如将程序中的SQL Server数据库全部替换成Access数据库,使用抽象方法的话,只需要在IFactory中定好增删改查4个方法,让SQLFactory和AccessFactory实现此接口,调用时直接使用IFactory的抽象方法即可,调用者无需知道使用的是什么数据库,我们可以很方便的替换整个程序的数据库,并且客户端毫不知情。
缺点
太重了,如果IFactory需要新增功能,会影响到所有的具体的工厂子类(要实现抽象工厂的方法)。所以抽象工厂方法适用于增加同类工厂这样的横向扩展需求,不适合新增功能这样的纵向扩展。