概述

抽象方法模式是工厂方法模式的一种扩展,最简单的抽象方法模式会退化成了工厂方法模式,抽象方法模式提出了产品族的一个概念。那么什么是产品族呢?还是以汽车为例,汽车是一个产品的抽象,汽车的型号就是汽车的产品族比如,suv,轿车,跑车。如果工厂模式创建的不是一个简单的产品,而是多个产品族的情况,那么就需要使用抽象方法模式

类图

抽象方法模式需要以下几个角色

  • 抽象工厂类

  • 产品工厂类

  • 抽象产品类

  • 产品类
    image.png

    代码实现

    1
    2
    3
    4
    5
    public abstract class  AbstractCarFactory {
    abstract void buildSuv();
    abstract void buildJiaoche();
    abstract void buildYueYeChe();
    }

    public class BaoJunCarFactory extends AbstractCarFactory {
    private BaojunCar baojunCar=new BaojunCar();
    @Override
    void buildSuv() {

      baojunCar.suv();
    

    }

    @Override
    void buildJiaoche() {

      baojunCar.jiaoche();
    

    }

    @Override
    void buildYueYeChe() {

      baojunCar.yueyeche();
    

    }
    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class BMWCarFactory extends AbstractCarFactory {

private BMWCar bmwCar =new BMWCar();

@Override
void buildSuv() {
bmwCar.suv();
}

@Override
void buildJiaoche() {
bmwCar.jiaoche();
}

@Override
void buildYueYeChe() {
bmwCar.yueyeche();
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class BaojunCar implements Car {


@Override
public void yueyeche() {
System.out.println("宝骏 越野车");
}

@Override
public void jiaoche() {
System.out.println("宝骏 轿车");
}

@Override
public void suv() {
System.out.println("宝骏 suv");
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class BMWCar implements Car {
@Override
public void yueyeche() {
System.out.println("宝马 越野车");
}

@Override
public void jiaoche() {
System.out.println("宝马 轿车");
}

@Override
public void suv() {
System.out.println("宝马 suv");
}
}
1
2
3
4
5
public interface Car {
void yueyeche();
void jiaoche();
void suv();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Main {
public static void main(String[] args) {
BaoJunCarFactory baoJunCarFactory =new BaoJunCarFactory();
baoJunCarFactory.buildJiaoche();
baoJunCarFactory.buildSuv();
baoJunCarFactory.buildYueYeChe();


BMWCarFactory bmwCarFactory =new BMWCarFactory();
bmwCarFactory.buildJiaoche();
bmwCarFactory.buildSuv();
bmwCarFactory.buildYueYeChe();
}
}

可以看到我们的抽象工厂定义了多个抽象方法,这也就是为什么叫抽象方法模式的原因了。实际上和工厂方法模式一样。只是有产品族抽象方法的概念

优缺点

优点:

  • 复合高内聚低耦合的开发设计规范,抽象工厂模式将创建产品的逻辑收敛起来,如果更换产品只需要选择对应的工厂方法即可
  • 增加具体产品工厂和产品很方便
  • 当产品族中的多个对象一起工作的时候,客户端只能使用同一个产品族的对象

    缺点:

  • 开闭原则的倾斜性,增加产品和产品工厂很方便,增加产品族很困难,所以设计抽象方法的时候一定要尽可能多的设计抽象方法

应用场景

客户端切换界面主题, 各个控件对象的构造过程都收敛到同一个工厂类中