1.定义
为创建一组相关或者相互依赖的对象提供一个接口,而不需要指定他们的具体类。
2.使用场景
一个对象族有相同的约束时可以使用抽象工厂模式。例如之前工厂方法模式的汽车组装例子,Q3、Q5、Q7都是同一个车系,但是零部件差别很大,Q3发动机是国产的而Q7是原装进口的,Q3的轮胎是普通轮胎,Q7是全尺寸越野轮胎等等。
3.简单实现
还是以汽车生产为例,Q3、Q7都是同一系列车,但是发动机、轮胎、制动系统都是不同的产品类型。
//定义轮胎的接口 interface ITire{ void tire(); } //定义一个普通轮胎 class NormalTire implements ITire{ @Override public void tire() { System.out.println("普通轮胎"); } } //定义一个越野轮胎 class SUVTire implements ITire{ @Override public void tire() { System.out.println("越野轮胎"); } } //定义发动机的接口 interface IEngine{ void engine(); } //国产发动机 class DomesticEngine implements IEngine{ @Override public void engine() { System.out.println("国产发动机"); } } //进口发动机 class ImportEngine implements IEngine{ @Override public void engine() { System.out.println("进口发动机"); } } //定义制动系统接口 interface IBrake{ void brake(); } //普通制动 class NormalBrake implements IBrake{ @Override public void brake() { System.out.println("普通制动"); } } //高级制动 class SeniorBrake implements IBrake{ @Override public void brake() { System.out.println("高级制动"); } } //抽象车厂 abstract class CarFactory{ //生产轮胎 public abstract ITire createTire(); //生产发动机 public abstract IEngine createEngine(); //生产制动系统 public abstract IBrake createBrake(); } //生产Q3汽车 class Q3 extends CarFactory{ @Override public ITire createTire() { //装配普通轮胎 return new NormalTire(); } @Override public IEngine createEngine() { //装配国产发动机 return new DomesticEngine(); } @Override public IBrake createBrake() { //装配普通制动系统 return new NormalBrake(); } } //生产Q7 class Q7 extends CarFactory{ @Override public ITire createTire() { //装配越野轮胎 return new SUVTire(); } @Override public IEngine createEngine() { //进口发动机 return new ImportEngine(); } @Override public IBrake createBrake() { //高级制动系统 return new SeniorBrake(); } } public class AbsFactoryMode { public static void main(String[] args) { //构造一个Q3工厂 Q3 q3 = new Q3(); q3.createEngine().engine(); q3.createTire().tire(); q3.createBrake().brake(); //构造Q7工厂 Q7 q7 = new Q7(); q7.createTire().tire(); q7.createEngine().engine(); q7.createBrake().brake(); } }
输出结果:
4.小结
优点:接口实现相分离,客户端只是面向接口编程,从具体的实现解耦。
缺点:文件类增加,不太容易拓展新产品,增加一个产品就需要修改抽象工厂,那么所有的具体工厂类均会被修改。