工厂模式(下)

抽象工厂模式

定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类

在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。但是有时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。

抽象工厂模式结构

抽象工厂模式包含如下角色:

  1. 抽象工厂:声明生成一系列抽象产品的方法
  2. 具体工厂:执行生成一系列抽象产品的方法,生成一系列具体的产品
  3. 抽象产品:为这一系列的某一种产品声明接口
  4. 具体产品:定义具体工厂生成的具体产品的对象,实现产品接口
  5. 客户:我们的应用程序客户端,使用抽象产品和抽象工厂生成对象

抽象工厂模式类图:

进一步了解抽象工厂模式

产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。

产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。

引入了产品等级结构和产品族的概念后,我们可以知道,抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。

在抽象工厂模式中,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。

代码实例

代码演示的内容:抽象工厂模式模拟奥迪车的生产过程

抽象产品:

1
2
3
4
5
6
7
public interface AirConditioner {
void airConditioner();
}
public interface Tire {
void tire();
}

具体产品:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class AirConditionerA implements AirConditioner {
@Override
public void airConditioner() {
System.out.println("空调A");
}
}
public class AirConditionerB implements AirConditioner {
@Override
public void airConditioner() {
System.out.println("空调B");
}
}
public class TireA implements Tire {
@Override
public void tire() {
System.out.println("轮胎A");
}
}
public class TireB implements Tire {
@Override
public void tire() {
System.out.println("轮胎B");
}
}

抽象工厂:

1
2
3
4
5
public interface IAbstractFactory {
AirConditioner getAirConditioner();
Tire getTire();
}

具体工厂:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class AudiA4LFactory implements IAbstractFactory {
@Override
public AirConditioner getAirConditioner() {
return new AirConditionerA();
}
@Override
public Tire getTire() {
return new TireA();
}
}
public class AudiA6LFactory implements IAbstractFactory {
@Override
public AirConditioner getAirConditioner() {
return new AirConditionerB();
}
@Override
public Tire getTire() {
return new TireB();
}
}

客户调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class AbstractFactoryTest {
@Test
public void test() {
IAbstractFactory factory1 = new AudiA4LFactory();
AirConditioner airConditioner1 = factory1.getAirConditioner();
Tire tire1 = factory1.getTire();
System.out.print("奥迪A4L的空调是:");
airConditioner1.airConditioner();
System.out.print("奥迪A4L的轮胎是:");
tire1.tire();
IAbstractFactory factory2 = new AudiA6LFactory();
AirConditioner airConditioner2 = factory2.getAirConditioner();
Tire tire2 = factory2.getTire();
System.out.print("奥迪A6L的空调是:");
airConditioner2.airConditioner();
System.out.print("奥迪A6L的轮胎是:");
tire2.tire();
}
}

输出:
奥迪A4L的空调是:空调A
奥迪A4L的轮胎是:轮胎A
奥迪A6L的空调是:空调B
奥迪A6L的轮胎是:轮胎B

0%