目录
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或依赖对象的接口,而无需指定它们具体的类。抽象工厂模式的核心思想是在一个高层接口中声明一组相关的对象,而不必明确指出具体的类。这使得整个产品族可以被方便地交换。
抽象工厂模式的基本概念
抽象工厂模式主要包含以下几个组成部分:
- 抽象产品族(Abstract Product Family):一组相关联的对象。
- 具体产品族(Concrete Product Family):实现了抽象产品族的具体对象。
- 抽象工厂(Abstract Factory):声明了一个或多个用于创建抽象产品的方法。
- 具体工厂(Concrete Factory):实现了抽象工厂接口,创建出具体的产品对象。
抽象工厂模式的实现
例子:创建图形和颜色对象
假设我们需要创建不同的图形对象(如圆形、矩形)和颜色对象(如红色、蓝色)。我们可以使用抽象工厂模式来创建这些对象。
步骤1:定义抽象产品
首先定义两个抽象产品接口,一个是Color
,另一个是Shape
:
java
深色版本
1public interface Color {
2 void fill();
3}
4
5public interface Shape {
6 void draw();
7}
步骤2:定义具体产品
接着定义实现上述接口的具体产品类:
java
深色版本
1public class Red implements Color {
2 @Override
3 public void fill() {
4 System.out.println("Inside Red::fill() method.");
5 }
6}
7
8public class Blue implements Color {
9 @Override
10 public void fill() {
11 System.out.println("Inside Blue::fill() method.");
12 }
13}
14
15public class Circle implements Shape {
16 @Override
17 public void draw() {
18 System.out.println("Inside Circle::draw() method.");
19 }
20}
21
22public class Rectangle implements Shape {
23 @Override
24 public void draw() {
25 System.out.println("Inside Rectangle::draw() method.");
26 }
27}
步骤3:定义抽象工厂
定义一个抽象工厂接口,这里是一个AbstractFactory
接口:
java
深色版本
1public interface AbstractFactory {
2 Color getColor(String color);
3 Shape getShape(String shape);
4}
步骤4:定义具体工厂
定义一个具体工厂类来实现AbstractFactory
接口:
java
深色版本
1public class ShapeFactory implements AbstractFactory {
2 @Override
3 public Color getColor(String color) {
4 return null; // ShapeFactory 不创建颜色对象
5 }
6
7 @Override
8 public Shape getShape(String shape) {
9 if (shape == null) {
10 return null;
11 }
12 if (shape.equalsIgnoreCase("CIRCLE")) {
13 return new Circle();
14 } else if (shape.equalsIgnoreCase("RECTANGLE")) {
15 return new Rectangle();
16 }
17 return null;
18 }
19}
20
21public class ColorFactory implements AbstractFactory {
22 @Override
23 public Color getColor(String color) {
24 if (color == null) {
25 return null;
26 }
27 if (color.equalsIgnoreCase("RED")) {
28 return new Red();
29 } else if (color.equalsIgnoreCase("BLUE")) {
30 return new Blue();
31 }
32 return null;
33 }
34
35 @Override
36 public Shape getShape(String shape) {
37 return null; // ColorFactory 不创建形状对象
38 }
39}
步骤5:客户端代码
最后,客户端代码可以使用具体工厂来获取具体的图形和颜色对象:
java
深色版本
1public class ClientApp {
2 public static void main(String[] args) {
3 // 创建 ShapeFactory 对象
4 AbstractFactory shapeFactory = new ShapeFactory();
5
6 // 获取形状类型为 Circle 的对象
7 Shape shape1 = shapeFactory.getShape("CIRCLE");
8 shape1.draw(); // 输出 Inside Circle::draw() method.
9
10 // 获取形状类型为 Rectangle 的对象
11 Shape shape2 = shapeFactory.getShape("RECTANGLE");
12 shape2.draw(); // 输出 Inside Rectangle::draw() method.
13
14 // 创建 ColorFactory 对象
15 AbstractFactory colorFactory = new ColorFactory();
16
17 // 获取颜色类型为 Red 的对象
18 Color color1 = colorFactory.getColor("RED");
19 color1.fill(); // 输出 Inside Red::fill() method.
20
21 // 获取颜色类型为 Blue 的对象
22 Color color2 = colorFactory.getColor("BLUE");
23 color2.fill(); // 输出 Inside Blue::fill() method.
24 }
25}
抽象工厂模式的优点
- 封装性:抽象工厂模式将对象创建的过程封装在一个类中,提高了代码的可读性和可维护性。
- 扩展性:可以在不修改原有代码的情况下添加新的产品族。
- 降低耦合度:客户端代码只需要知道抽象工厂接口,不需要关心具体的创建逻辑。
- 一致性:可以保证创建的对象是一致的,因为它们来自于同一个工厂。
抽象工厂模式的缺点
- 增加复杂度:引入了更多的抽象类和接口,增加了系统的复杂度。
- 过度使用:在不需要的地方使用抽象工厂模式可能会导致不必要的复杂性。
总结
抽象工厂模式是一种有用的模式,特别是在需要创建一组相关的对象,并且希望这些对象的创建逻辑可以在不修改现有代码的情况下进行扩展或更改时。通过将创建逻辑集中在一个地方,可以提高代码的灵活性和可维护性。