目录标题
- 抽象工厂设计模式详解
-
- [1. 介绍](#1. 介绍)
- [2. 结构](#2. 结构)
- [3. 实现步骤](#3. 实现步骤)
-
- [3.1 创建抽象产品接口](#3.1 创建抽象产品接口)
- [3.2 创建具体产品类](#3.2 创建具体产品类)
- [3.3 创建抽象工厂接口](#3.3 创建抽象工厂接口)
- [3.4 创建具体工厂类](#3.4 创建具体工厂类)
- [4. 好处与优点](#4. 好处与优点)
- [5. 坏处与缺点](#5. 坏处与缺点)
- [6. 适用场景](#6. 适用场景)
- [7. 总结](#7. 总结)
抽象工厂设计模式详解
1. 介绍
抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或依赖对象的接口,而无需指定它们具体的类。抽象工厂模式与工厂方法模式相比,不仅仅是针对单一产品的创建,而是针对产品族的创建,即相关联的产品组合。
2. 结构
抽象工厂模式的主要结构包括以下几个角色:
- 抽象工厂(AbstractFactory):声明一组用于创建一系列产品对象的方法,每个方法对应一个具体产品组合。
- 具体工厂(ConcreteFactory):实现抽象工厂接口,负责创建具体产品对象。
- 抽象产品(AbstractProduct):声明一组产品对象的接口。
- 具体产品(ConcreteProduct):实现抽象产品接口,是工厂方法模式中具体创建的对象。
3. 实现步骤
下面以一个简单的示例来说明抽象工厂模式的实现过程,假设我们有两种类型的产品族:形状(Shape)和颜色(Color),每种产品族有对应的两种具体产品。
3.1 创建抽象产品接口
java
// Shape.java
public interface Shape {
void draw();
}
// Color.java
public interface Color {
void fill();
}
3.2 创建具体产品类
java
// Circle.java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("画一个圆形");
}
}
// Square.java
public class Square implements Shape {
@Override
public void draw() {
System.out.println("画一个正方形");
}
}
// Red.java
public class Red implements Color {
@Override
public void fill() {
System.out.println("填充红色");
}
}
// Blue.java
public class Blue implements Color {
@Override
public void fill() {
System.out.println("填充蓝色");
}
}
3.3 创建抽象工厂接口
java
// AbstractFactory.java
public interface AbstractFactory {
Shape createShape();
Color createColor();
}
3.4 创建具体工厂类
java
// ShapeFactory.java
public class ShapeFactory implements AbstractFactory {
@Override
public Shape createShape() {
return new Circle();
}
@Override
public Color createColor() {
return new Red();
}
}
// ColorFactory.java
public class ColorFactory implements AbstractFactory {
@Override
public Shape createShape() {
return new Square();
}
@Override
public Color createColor() {
return new Blue();
}
}
3.5 客户端使用
java
// Client.java
public class Client {
public static void main(String[] args) {
AbstractFactory shapeFactory = new ShapeFactory();
Shape shape = shapeFactory.createShape();
Color color = shapeFactory.createColor();
shape.draw();
color.fill();
AbstractFactory colorFactory = new ColorFactory();
Shape shape2 = colorFactory.createShape();
Color color2 = colorFactory.createColor();
shape2.draw();
color2.fill();
}
}
4. 好处与优点
- 产品族一致性:抽象工厂模式能够确保所创建的产品都属于同一产品族,保证了产品之间的兼容性。
- 易于替换:由于具体工厂负责创建一整个产品族,所以可以轻松地替换整个产品族,而无需修改客户端代码。
- 符合单一职责原则:每个具体工厂只负责创建一种产品族,符合单一职责原则。
5. 坏处与缺点
难以扩展新的产品族:抽象工厂模式在增加新的产品族时,需要修改抽象工厂接口及所有具体工厂类,对系统的扩展性有一定影响。
增加了系统复杂度:引入了更多的类和接口,增加了系统的复杂度,适用于较复杂的场景。
6. 适用场景
抽象工厂模式适用于以下场景:
- 需要创建一系列相关或依赖对象的产品族,并希望这些产品族之间保持一致性。
- 系统有多个产品族,但每次只使用其中一个产品族。
- 客户端不依赖于产品的创建细节,只关心产品的接口。
7. 总结
抽象工厂模式是一种常见且实用的设计模式,通过提供一组相关产品的创建接口,保证了产品族的一致性,同时也降低了客户端与具体产品的耦合度。在设计系统时,根据具体需求选择合适的设计模式能够提高代码的可维护性和可扩展性。