简单工厂模式(Simple Factory Pattern)
简单工厂模式是一种 创建型设计模式,它通过一个工厂类来根据参数创建不同类型的对象,客户端不需要知道具体的实现类。
原理
- 核心思想:提供一个工厂类,由它决定实例化哪个具体产品类。
- 参与角色 :
- 工厂类(Factory):包含用于创建产品对象的逻辑。
- 产品类(Product):所有创建对象的父类或接口。
- 具体产品类(Concrete Product):工厂类创建的具体对象。
- 客户端(Client) :通过工厂获取产品,而不直接使用
new
操作符。
优点
- 解耦:客户端无需直接依赖具体类,依赖于工厂和抽象产品。
- 简单易用:实现简单,适合创建单一类型或少量产品对象。
缺点
- 不符合开闭原则:增加新产品时需要修改工厂代码。
- 单一职责问题:工厂类承担了过多的职责,可能会导致代码复杂度增加。
示例代码
场景描述
设计一个图形工厂,用于创建不同类型的图形对象(如圆形和矩形)。
1. 定义抽象产品和具体产品
java
// 抽象产品:图形
public interface Shape {
void draw();
}
// 具体产品:圆形
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Circle.");
}
}
// 具体产品:矩形
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Rectangle.");
}
}
2. 定义工厂类
java
// 工厂类
public class ShapeFactory {
// 静态方法,根据类型创建产品
public static Shape createShape(String type) {
if (type == null) {
throw new IllegalArgumentException("Type cannot be null");
}
switch (type.toLowerCase()) {
case "circle":
return new Circle();
case "rectangle":
return new Rectangle();
default:
throw new IllegalArgumentException("Unknown shape type: " + type);
}
}
}
3. 客户端代码
java
public class SimpleFactoryExample {
public static void main(String[] args) {
// 使用工厂创建产品
Shape circle = ShapeFactory.createShape("circle");
circle.draw(); // Output: Drawing a Circle.
Shape rectangle = ShapeFactory.createShape("rectangle");
rectangle.draw(); // Output: Drawing a Rectangle.
// 如果传入未知类型,会抛出异常
try {
Shape unknown = ShapeFactory.createShape("triangle");
unknown.draw();
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage()); // Output: Unknown shape type: triangle
}
}
}
输出结果
text
Drawing a Circle.
Drawing a Rectangle.
Unknown shape type: triangle
UML 类图
+----------------+
| ShapeFactory |
|----------------|
| + createShape()|
+----------------+
|
v
+------------------+
| Shape |
|------------------|
| + draw() |
+------------------+
/ \
+---------+ +-----------+
| Circle | | Rectangle |
|---------| |-----------|
| + draw()| | + draw() |
+---------+ +-----------+
适用场景
- 对象创建逻辑复杂:将创建逻辑集中到工厂中,简化客户端代码。
- 类型有限的产品:适合创建数量较少的对象类型。
- 客户端与产品解耦:客户端不需要知道具体类名,只需提供产品类型。
小结
- 简单工厂模式适合创建单一产品族中的有限产品。
- 它实现简单,但扩展性差,增加新产品需要修改工厂逻辑。
- 在实际使用中,通常被视为一种过渡模式,复杂场景中可以使用 工厂方法模式 或 抽象工厂模式 进行改进。