使用工厂方法模式足以应付我们可能遇到的大部分业务需求。
但是当产品种类非常多时,就会出现 大量的与之对应的工厂类,这不应该是我们所希望的。所以建议在这种情况下使用简单工厂模式与工厂 方法模式相结合的方式来减少工厂类:
即
下面我们来详细看一下抽象工厂:
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
首先我们要理解产品族和产品等级:
产品族:一个品牌下面的所有产品;例如奥迪下面的商务型、MINI型称为华为的产品族;
产品等级:多个品牌下面的同种产品;例如奥迪和宝马下面的各种商务车型,称为一个产品等级;

抽象工厂模式的各个角色和工厂方法的如出一辙:
| 角色 | 说明 |
|---|---|
| 抽象工厂角色 | 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的 父类。在java中它由抽象类或者接口来实现 |
| 具体工厂角色 | 它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它 由具体的类来实现 |
| 抽象产品角色 | 它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现 |
| 具体产品角色 | 具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现 |
抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展
抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这就违背了"开闭原则"。
使用抽象工厂模式的系统应该符合以下几个条件:
下面我们实现一个案例来分析一下
以生产不同厂牌生产不同车型为例子:
类图分析:

代码如下:
商务车抽象产品族:BusinessCar
package com.shixun.design.factory.abstract_factory;
import com.shixun.design.factory.Car;
/**
* 抽象产品族(BusinessCar)
*/
public interface BusinessCar extends Car {
boolean isAutoDoor();
}
MINI车抽象产品族:SportCar
package com.shixun.design.factory.abstract_factory;
import com.shixun.design.factory.Car;
/**
* 抽象产品族(SportCar)
*/
public interface SportCar extends Car {
boolean isStrong();
}
AodiBusinessCar
package com.shixun.design.factory.abstract_factory;
/**
* 新业务奥迪商务汽车
*/
public class AodiBusinessCar implements BusinessCar {
@Override
public boolean isAutoDoor() {
return false;
}
@Override
public void show() {
System.out.println("我是Aodi的商务汽车");
}
}
AodiSportCar
package com.shixun.design.factory.abstract_factory;
/**
* 新业务奥迪运动汽车
*/
public class AodiSportCar implements SportCar {
@Override
public boolean isStrong() {
return false;
}
@Override
public void show() {
System.out.println("我是Aodi的运动汽车");
}
}
BenzBusinessCar
package com.shixun.design.factory.abstract_factory;
/**
* 具体产品(BenzBusinessCar)
*/
public class BenzBusinessCar implements BusinessCar {
@Override
public boolean isAutoDoor() {
return true;
}
@Override
public void show() {
System.out.println("我是Benz的商务汽车");
}
}
BenzSportCar
package com.shixun.design.factory.abstract_factory;
/**
* 具体产品(BenzSportCar)
*/
public class BenzSportCar implements SportCar {
@Override
public boolean isStrong() {
return true;
}
@Override
public void show() {
System.out.println("我是Benz的运动汽车");
}
}
BmwBusinessCar
package com.shixun.design.factory.abstract_factory;
/**
* 具体产品(BmwBusinessCar)
*/
public class BmwBusinessCar implements BusinessCar {
@Override
public boolean isAutoDoor() {
return true;
}
@Override
public void show() {
System.out.println("我是Bmw的商务汽车");
}
}
BmwSportCar
package com.shixun.design.factory.abstract_factory;
/**
* 具体产品(BmwSportCar)
*/
public class BmwSportCar implements SportCar {
@Override
public boolean isStrong() {
return true;
}
@Override
public void show() {
System.out.println("我是Bmw的运动汽车");
}
}
生产的抽象工厂:CarFactory
定义两个接口方法:
package com.shixun.design.factory.abstract_factory;
/**
* 抽象工厂
*/
public interface CarFactory {
/**
* 生产运动汽车
*
* @return
*/
SportCar produceSportCar();
/**
* 生产商务汽车
*
* @return
*/
BusinessCar produceBusinessCar();
}
AodiCarFactory
package com.shixun.design.factory.abstract_factory;
/**
* 新业务工厂AodiCarFactory
*/
public class AodiCarFactory implements CarFactory {
@Override
public SportCar produceSportCar() {
return new AodiSportCar();
}
@Override
public BusinessCar produceBusinessCar() {
return new AodiBusinessCar();
}
}
BmwCarFactory
package com.shixun.design.factory.abstract_factory;
/**
* 具体工厂(BenzCarFactory)
*/
public class BenzCarFactory implements CarFactory {
@Override
public SportCar produceSportCar() {
return new BenzSportCar();
}
@Override
public BusinessCar produceBusinessCar() {
return new BenzBusinessCar();
}
}
BenzCarFactory
package com.shixun.design.factory.abstract_factory;
/**
* 具体工厂(BmwCarFactory)
*/
public class BmwCarFactory implements CarFactory {
@Override
public SportCar produceSportCar() {
return new BmwSportCar();
}
@Override
public BusinessCar produceBusinessCar() {
return new BmwBusinessCar();
}
}
编写测试类:
package com.shixun.design.factory.abstract_factory;
/**
* 使用者
*/
public class Test {
public static void main(String[] args) {
//生产Bmw
BmwCarFactory bmwCarFactory = new BmwCarFactory();
//宝马运动
SportCar bmwSportCar = bmwCarFactory.produceSportCar();
System.out.println("宝马运动strong:" + bmwSportCar.isStrong());
bmwSportCar.show();
//宝马商务
BusinessCar bmwBusinessCar = bmwCarFactory.produceBusinessCar();
System.out.println("宝马商务autoDoor:" + bmwBusinessCar.isAutoDoor());
bmwBusinessCar.show();
//生产Benz
BenzCarFactory benzCarFactory = new BenzCarFactory();
//奔驰运动
SportCar benzSportCar = benzCarFactory.produceSportCar();
System.out.println("奔驰运动strong:" + benzSportCar.isStrong());
benzSportCar.show();
//奔驰商务
BusinessCar benzBusinessCar = benzCarFactory.produceBusinessCar();
System.out.println("奔驰自动autoDoor:" + benzBusinessCar.isAutoDoor());
benzBusinessCar.show();
//新业务
//生产Aodi
AodiCarFactory aodiCarFactory = new AodiCarFactory();
//奥迪运动
SportCar aodiSportCar = aodiCarFactory.produceSportCar();
System.out.println("奥迪运动strong:" + aodiSportCar.isStrong());
aodiSportCar.show();
//奥迪商务
BusinessCar aodiBusinessCar = aodiCarFactory.produceBusinessCar();
System.out.println("奥迪自动autoDoor:" + aodiBusinessCar.isAutoDoor());
aodiBusinessCar.show();
}
}
运行结果如下:
