在复杂的工程管理系统中,经常需要创建不同类型的任务、资源或报告对象,这些对象虽然遵循共同的接口,但具体实现却因类型而异。如果直接在业务逻辑中通过new关键字实例化具体类,会导致代码高度耦合,难以扩展和维护。此时,工厂方法模式(Factory Method Pattern)便提供了一个优雅的解决方案。
工厂方法模式定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。它通过将对象的创建过程封装起来,使得客户端代码无需关心具体的创建细节,只需依赖抽象接口,从而实现了依赖倒置原则,提高了系统的灵活性和可扩展性。
假设我们正在开发一个工程管理服务平台,需要处理多种类型的工程任务,例如:设计任务、采购任务、施工任务。每种任务都有共同的属性(如任务ID、名称、负责人)和共同的行为(如启动、暂停、生成报告),但它们的执行逻辑和报告格式完全不同。
不使用模式的痛点:
客户端代码可能会充斥着大量的if-else或switch-case判断:`java
if (taskType.equals("DESIGN")) {
task = new DesignTask();
} else if (taskType.equals("PROCUREMENT")) {
task = new ProcurementTask();
} else if (taskType.equals("CONSTRUCTION")) {
task = new ConstructionTask();
}
task.execute();`
这种代码对修改是封闭的,每当新增一种任务类型,就必须修改所有创建任务的地方,违反了开闭原则,且难以进行单元测试。
Task接口,声明所有任务共有的方法,如execute()和generateReport()。Task接口,创建DesignTask、ProcurementTask、ConstructionTask等具体类,实现各自特有的业务逻辑。TaskFactory抽象类,其中声明一个抽象的工厂方法createTask(),返回类型为Task。这个类也可以包含一些与任务创建相关的基础逻辑。DesignTaskFactory、ProcurementTaskFactory。每个具体工厂负责实现createTask()方法,返回对应的具体任务对象。重构后的客户端调用:`java
// 客户端代码只依赖于抽象工厂和抽象产品
TaskFactory factory = new DesignTaskFactory(); // 具体工厂可通过配置、依赖注入等方式获得
Task task = factory.createTask(); // 创建具体产品的细节被隐藏
task.execute();`
Task接口和TaskFactory抽象交互。监理任务)时,只需新增对应的SupervisionTask类和SupervisionTaskFactory类,无需修改任何现有的工厂和客户端代码。在更复杂的工程管理服务中,工厂方法模式可以进一步演化:
createTask()方法可以接收参数(如任务配置参数),使得工厂能根据参数创建更符合上下文的对象。createTask()这个步骤作为模板方法中的一个可变环节。###
在工程管理服务这类业务对象多样、且可能频繁扩展的系统中,工厂方法模式通过将对象的创建与使用分离,为我们构建了一个灵活、稳固的架构基础。它不仅是解决对象创建问题的利器,更是面向对象设计原则(如开闭原则、依赖倒置原则)的生动实践。正确运用此模式,能显著提升工程管理软件应对需求变化的能力。
如若转载,请注明出处:http://www.170081.com/product/45.html
更新时间:2026-01-13 02:48:27