Java工厂模式
外观
工厂模式(Factory Pattern)是Java设计模式中最常用的创建型模式之一,其主要目的是通过一个共同的接口来创建对象,而无需指定具体的实现类。这种模式将对象的实例化过程封装在工厂类中,提高了代码的灵活性和可维护性。
概述[编辑 | 编辑源代码]
工厂模式的核心思想是将对象的创建与使用分离。客户端无需关心对象的具体创建逻辑,只需通过工厂类获取所需对象。根据抽象程度的不同,工厂模式可分为以下三种类型:
- 简单工厂模式(Simple Factory)
- 工厂方法模式(Factory Method)
- 抽象工厂模式(Abstract Factory)
适用场景[编辑 | 编辑源代码]
- 需要动态创建不同类的实例时
- 系统需要解耦对象的创建与使用
- 需要统一管理对象的生命周期
简单工厂模式[编辑 | 编辑源代码]
简单工厂模式通过一个工厂类根据输入参数决定创建哪种产品类的实例。
代码示例[编辑 | 编辑源代码]
以下是一个简单的形状工厂示例:
// 产品接口
interface Shape {
void draw();
}
// 具体产品类
class Circle implements Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
// 简单工厂类
class ShapeFactory {
public Shape createShape(String type) {
if ("circle".equalsIgnoreCase(type)) {
return new Circle();
} else if ("rectangle".equalsIgnoreCase(type)) {
return new Rectangle();
}
throw new IllegalArgumentException("未知形状类型");
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
ShapeFactory factory = new ShapeFactory();
Shape circle = factory.createShape("circle");
circle.draw(); // 输出: 绘制圆形
}
}
优缺点[编辑 | 编辑源代码]
- 优点:客户端与具体类解耦
- 缺点:违反开闭原则(新增类型需修改工厂类)
工厂方法模式[编辑 | 编辑源代码]
工厂方法模式通过让子类决定实例化哪个类来扩展简单工厂模式。
类图[编辑 | 编辑源代码]
代码示例[编辑 | 编辑源代码]
// 抽象工厂接口
interface ShapeFactory {
Shape createShape();
}
// 具体工厂类
class CircleFactory implements ShapeFactory {
@Override
public Shape createShape() {
return new Circle();
}
}
class RectangleFactory implements ShapeFactory {
@Override
public Shape createShape() {
return new Rectangle();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
ShapeFactory factory = new CircleFactory();
Shape shape = factory.createShape();
shape.draw(); // 输出: 绘制圆形
}
}
抽象工厂模式[编辑 | 编辑源代码]
抽象工厂模式提供一个创建一系列相关或依赖对象的接口,而无需指定具体类。
实际案例[编辑 | 编辑源代码]
假设需要创建跨平台的UI组件:
// 抽象产品接口
interface Button { void render(); }
interface Checkbox { void toggle(); }
// Windows系列产品
class WinButton implements Button {
public void render() { System.out.println("Windows按钮渲染"); }
}
class WinCheckbox implements Checkbox {
public void toggle() { System.out.println("Windows复选框切换"); }
}
// Mac系列产品
class MacButton implements Button {
public void render() { System.out.println("Mac按钮渲染"); }
}
class MacCheckbox implements Checkbox {
public void toggle() { System.out.println("Mac复选框切换"); }
}
// 抽象工厂
interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
// 具体工厂
class WinFactory implements GUIFactory {
public Button createButton() { return new WinButton(); }
public Checkbox createCheckbox() { return new WinCheckbox(); }
}
class MacFactory implements GUIFactory {
public Button createButton() { return new MacButton(); }
public Checkbox createCheckbox() { return new MacCheckbox(); }
}
数学原理(可选)[编辑 | 编辑源代码]
工厂模式可以形式化为: 其中是输入参数类型,是产品接口。
总结[编辑 | 编辑源代码]
模式类型 | 特点 | 适用场景 |
---|---|---|
简单工厂 | 集中式创建 | 对象种类较少 |
工厂方法 | 单一职责原则 | 需要扩展产品族 |
抽象工厂 | 创建产品簇 | 跨平台/多系列 |
工厂模式通过封装变化来提高系统灵活性,是面向对象设计中开闭原则的典型实践。