设计模式——抽象工厂模式
一、基本概念
1. 定义
抽象工厂模式(英语:Abstract factory pattern)是一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。
在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。
2. 优缺点
优点:
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
- 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
- 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
- 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
- 当需要产品族时,抽象工厂可以保证客户端始终只使用同一个产品的产品组。
- 抽象工厂增强了程序的可扩展性,当增加一个新的产品族时,不需要修改原代码,满足开闭原则。
缺点:
- 当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。
3. 结构
抽象工厂模式的主要角色如下。
- 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品;
- 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。

二、代码实现
AbstractFactory.java
:
1
2
3
4
5
6
7
8
9
| package pers.designPattern.abstractFactory;
/*
* 抽象工厂
* */
abstract class AbstractFactory {
public abstract Color getColor(String color);
public abstract Shape getShape(String shape);
}
|
ShapeFactory.java
:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| package pers.designPattern.abstractFactory;
/*
* 形状工厂
* */
interface Shape {
void creatShape();
}
class Rectangle implements Shape {
@Override
public void creatShape() {
System.out.println("创建一个矩形...");
}
}
class Circle implements Shape {
@Override
public void creatShape() {
System.out.println("创建一个圆形...");
}
}
class Square implements Shape {
@Override
public void creatShape() {
System.out.println("创建一个正方形...");
}
}
/*
* 创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象
* */
public class ShapeFactory extends AbstractFactory {
@Override
public Color getColor(String color) {
return null;
}
@Override
public Shape getShape(String shape) {
switch (shape) {
case "circle":
return new Circle();
case "rectangle":
return new Rectangle();
case "square":
return new Square();
default:
return null;
}
}
}
|
ColorFactory.java
:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| package pers.designPattern.abstractFactory;
/*
* 颜色工厂
* */
interface Color {
void fillColor();
}
class Red implements Color {
@Override
public void fillColor() {
System.out.println("喷涂红色...");
}
}
class Green implements Color {
@Override
public void fillColor() {
System.out.println("喷涂绿色...");
}
}
class Blue implements Color {
@Override
public void fillColor() {
System.out.println("喷涂蓝色...");
}
}
public class ColorFactory extends AbstractFactory {
@Override
public Color getColor(String color) {
switch (color) {
case "red":
return new Red();
case "green":
return new Green();
case "blue":
return new Blue();
default:
return null;
}
}
@Override
public Shape getShape(String shape) {
return null;
}
}
|
FactoryProcuder.java
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| package pers.designPattern.abstractFactory;
public class FactoryProducer {
/*
* 创建一个工厂生成器类,通过传递形状或颜色信息来获取工厂
* */
public static AbstractFactory getFactory(String choice) {
if (choice.equals("color")) {
return new ColorFactory();
} else if (choice.equals("shape")) {
return new ShapeFactory();
} else {
return null;
}
}
}
|
AbstractFactory.java
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| package pers.designPattern.abstractFactory;
import java.util.Objects;
public class AbstractFactoryClient {
/*
* 客户
* */
public static void main(String[] args) {
AbstractFactory sf = FactoryProducer.getFactory("shape");
Shape circle = Objects.requireNonNull(sf).getShape("circle");
circle.creatShape();
}
}
|
参考: