概述

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

类图

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

  • 抽象工厂类

  • 产品工厂类

  • 抽象产品类

  • 产品类\

    image.png
    旧站配图 1 未恢复 · 原 OSS 存储桶已经删除,原始地址已记录在迁移清单中。

代码实现

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
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
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();
}
}

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

优缺点

优点:

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

缺点:

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

应用场景

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