工厂方法模式是一种 创建型设计模式,其核心思想是 将对象的创建过程延迟到子类,让子类决定实例化哪个具体类。
createProduct()
),返回抽象产品类型。工厂方法模式适用于以下场景:
BeanFactory
)。典型场景:
+-------------------+ +-------------------+
| Creator | | Product |
+-------------------+ +-------------------+
| +factoryMethod() |<>------->| +operation() |
+-------------------+ +-------------------+
▲ ▲
| |
+---------------+-----------+ +-----------+-----------+
| ConcreteCreatorA | | ConcreteProductA |
+---------------------------+ +-----------------------+
| +factoryMethod() { | | +operation() { ... } |
| return new ProductA(); | +-----------------------+
| } |
+---------------------------+
场景:实现一个跨平台的按钮(Windows 和 MacOS 风格)。
步骤:
定义抽象产品:
public interface Button {
void render();
void onClick();
}
定义具体产品:
// Windows 按钮
public class WindowsButton implements Button {
@Override
public void render() {
System.out.println("渲染 Windows 风格按钮");
}
@Override
public void onClick() {
System.out.println("Windows 按钮点击事件");
}
}
// MacOS 按钮
public class MacOSButton implements Button {
@Override
public void render() {
System.out.println("渲染 MacOS 风格按钮");
}
@Override
public void onClick() {
System.out.println("MacOS 按钮点击事件");
}
}
定义抽象工厂:
public abstract class Dialog {
// 工厂方法:由子类实现具体逻辑
public abstract Button createButton();
// 公共逻辑
public void renderDialog() {
Button button = createButton();
button.render();
}
}
定义具体工厂:
// Windows 对话框工厂
public class WindowsDialog extends Dialog {
@Override
public Button createButton() {
return new WindowsButton();
}
}
// MacOS 对话框工厂
public class MacOSDialog extends Dialog {
@Override
public Button createButton() {
return new MacOSButton();
}
}
客户端调用:
public class Client {
public static void main(String[] args) {
// 根据配置选择具体工厂
Dialog dialog;
String os = System.getProperty("os.name").toLowerCase();
if (os.contains("win")) {
dialog = new WindowsDialog();
} else {
dialog = new MacOSDialog();
}
dialog.renderDialog(); // 渲染对应平台的按钮
}
}
通过参数决定创建哪种产品。
public abstract class Dialog {
public Button createButton(String type) {
if (type.equals("primary")) {
return new PrimaryButton();
} else if (type.equals("secondary")) {
return new SecondaryButton();
}
throw new IllegalArgumentException("未知按钮类型");
}
}
将工厂方法放在一个单独类中,通过静态方法创建对象。
public class ButtonFactory {
public static Button createButton(String osType) {
if (osType.equals("Windows")) {
return new WindowsButton();
} else if (osType.equals("MacOS")) {
return new MacOSButton();
}
throw new IllegalArgumentException("不支持的系统类型");
}
}
对比项 | 工厂方法模式 | 抽象工厂模式 | 简单工厂模式 |
---|---|---|---|
核心目标 | 创建单一产品 | 创建产品家族 | 集中化创建对象 |
扩展性 | 通过子类扩展 | 通过新工厂类扩展 | 需修改工厂类代码 |
设计原则 | 符合开闭原则 | 符合开闭原则 | 违反开闭原则 |
java.util.Collections
中的 unmodifiableCollection()
方法返回一个不可修改的集合(工厂方法)。BeanFactory
和 ApplicationContext
通过 getBean()
方法创建和管理对象。LoggerFactory.getLogger()
根据配置返回具体的日志实现类。@Bean
注解,通过配置管理工厂。new
,无需引入工厂。工厂方法模式通过 将对象的创建延迟到子类,实现了创建逻辑与业务逻辑的解耦,是构建灵活、可扩展系统的关键工具。
通过合理应用工厂方法模式,可以显著提升代码的可维护性和扩展性。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。