设计模式——抽象工厂模式

概念

抽象工厂模式是工厂方法模式的升级版本,它用来创建一组相关或者相互依赖的对象。

抽象工厂模式提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类。

就是一个工厂里放一些相关的类,使工厂数减少。

优点与缺点

最大的好处便是易于交换产品系列,其次是让具体的创建实例过程与客户端分离,客户端通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离。不会出现在客户代码中。

抽象工厂模式与工厂方法模式的区别

​ 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。

​ 在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。*也就是说,工厂模式中每个工厂造出来的东西都是同一个类别的,抽象工厂模式中,一个工厂可以造不同类别的东西。

我们依然拿生产汽车的例子来说明他们之间的区别。

奔驰车和宝马称为两个不同的等级结构(两种不同的车);而A空调车和B空调车则称为两个不同的产品族(车的属性)A引擎和B引擎也是不同的产品族。再具体一点,A空调宝马车和B空调宝马车属于同一个等级结构,A空调奔驰车和B空调奔驰车属于另一个等级结构;而A空调轿车和A空调越野车属于同一个产品族(同一个零部件),B空调车轿车和B空调越野车属于另一个产品族(同一个零部件)。

​ 明白了等级结构和产品族的概念,就理解工厂方法模式和抽象工厂模式的区别了.

抽象工厂方法就是一个工厂里生产不同等级结构中的一个(其中一种车)中的不同的配件(不同的车的属性)。

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
//产品类
//发动机以及型号
public interface Engine {

}
public class EngineA extends Engine{
public EngineA(){
System.out.println("制造-->EngineA");
}
}
public class EngineB extends Engine{
public EngineB(){
System.out.println("制造-->EngineB");
}
}
//空调以及型号
public interface Aircondition {

}
public class AirconditionA extends Aircondition{
public AirconditionA(){
System.out.println("制造-->AirconditionA");
}
}
public class AirconditionB extends Aircondition{
public AirconditionB(){
System.out.println("制造-->AirconditionB");
}
}
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
34
//工厂类
//创建工厂的接口
public interface AbstractFactory {
//制造发动机
public Engine createEngine();
//制造空调
public Aircondition createAircondition();
}


//为奔驰生产配件
public class 奔驰工厂 implements AbstractFactory{

@Override
public Engine createEngine() {
return new EngineA();
}
@Override
public Aircondition createAircondition() {
return new AirconditionA();
}
}
//为宝马车生产配件
public class 宝马工厂 implements AbstractFactory {

@Override
public Engine createEngine() {
return new EngineB();
}
@Override
public Aircondition createAircondition() {
return new AirconditionB();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//客户端
public class Customer {
public static void main(String[] args){
//奔驰生产配件
奔驰 j = new 奔驰();
j.createEngine();
j.createAircondition();

//宝马生产配件
宝马 y = new 宝马();
y.createEngine();
y.createAircondition();
}
}

抽象工厂模式也就是不仅生产引擎,同时生产空调。
也就是车工厂是个父类,有生产引擎,生产空调两个接口。
戴尔工厂,惠普工厂继承它,可以分别生产戴尔引擎+戴尔空调,和惠普引擎+惠普空调。
创建小米工厂时,小米工厂的引擎生产小米引擎,小米工厂的空调生产空调.

假设要多出来生产耳机这个产品,则首先我们需要增加耳麦这个父类,再加上戴尔耳麦,惠普耳麦这两个子类。
之后在PC厂商这个父类中,增加生产耳麦的接口。最后在戴尔工厂,惠普工厂这两个类中,分别实现生产戴尔耳麦,惠普耳麦的功能。