常用设计模式3:抽象工厂模式(Java)
抽象工厂模式(Abstract Factory Pattern)
1. 简介
抽象工厂模式是一种创建型设计模式,它提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。它提供了一个接口,用于创建相关的对象家族,而不需要指定它们具体的类。
2. 为什么使用抽象工厂模式?
- 解耦:客户端代码与具体产品的实现完全分离。
- 一致性:确保同一产品族的对象能够相互配合。
- 易于切换:整个产品族可以方便地切换。
- 开闭原则:可以引入新的产品族,而不需要修改现有的代码。
3. 抽象工厂模式的结构
抽象工厂模式主要包含以下几个角色:
- 抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法。
- 具体工厂(Concrete Factory):实现了抽象工厂的方法来创建具体产品。
- 抽象产品(Abstract Product):为一类产品对象声明接口。
- 具体产品(Concrete Product):定义一个将被相应具体工厂创建的产品对象。
4. Java 实现示例
让我们通过一个简单的家具制造的例子来说明抽象工厂模式:
4.1 定义抽象产品
// 抽象产品:椅子
public interface Chair {
void sitOn();
}
// 抽象产品:桌子
public interface Table {
void putOn();
}
4.2 实现具体产品
// 具体产品:现代风格椅子
public class ModernChair implements Chair {
@Override
public void sitOn() {
System.out.println("Sitting on a modern chair");
}
}
// 具体产品:现代风格桌子
public class ModernTable implements Table {
@Override
public void putOn() {
System.out.println("Putting on a modern table");
}
}
// 具体产品:维多利亚风格椅子
public class VictorianChair implements Chair {
@Override
public void sitOn() {
System.out.println("Sitting on a victorian chair");
}
}
// 具体产品:维多利亚风格桌子
public class VictorianTable implements Table {
@Override
public void putOn() {
System.out.println("Putting on a victorian table");
}
}
4.3 定义抽象工厂
public interface FurnitureFactory {
Chair createChair();
Table createTable();
}
4.4 实现具体工厂
// 具体工厂:现代风格家具工厂
public class ModernFurnitureFactory implements FurnitureFactory {
@Override
public Chair createChair() {
return new ModernChair();
}
@Override
public Table createTable() {
return new ModernTable();
}
}
// 具体工厂:维多利亚风格家具工厂
public class VictorianFurnitureFactory implements FurnitureFactory {
@Override
public Chair createChair() {
return new VictorianChair();
}
@Override
public Table createTable() {
return new VictorianTable();
}
}
4.5 客户端代码
public class Client {
public static void main(String[] args) {
// 使用现代风格家具工厂
FurnitureFactory modernFactory = new ModernFurnitureFactory();
Chair modernChair = modernFactory.createChair();
Table modernTable = modernFactory.createTable();
modernChair.sitOn();
modernTable.putOn();
// 使用维多利亚风格家具工厂
FurnitureFactory victorianFactory = new VictorianFurnitureFactory();
Chair victorianChair = victorianFactory.createChair();
Table victorianTable = victorianFactory.createTable();
victorianChair.sitOn();
victorianTable.putOn();
}
}
5. 抽象工厂模式的优缺点
优点:
- 确保了同一工厂生成的产品相互匹配。
- 避免了具体产品与客户端代码的耦合。
- 符合单一职责原则、开闭原则。
- 易于交换产品系列。
缺点:
- 代码可能变得比较复杂,因为需要引入许多新的接口和类。
- 难以支持新种类的产品。需要修改抽象工厂接口,这将涉及到所有的具体工厂。
6. 适用场景
- 系统需要独立于它的产品的创建、组合和表示时。
- 系统要由多个产品系列中的一个来配置时。
- 要强调一系列相关的产品对象的设计以便进行联合使用时。
- 提供一个产品类库,只想显示它们的接口而不是实现时。
7. 总结
抽象工厂模式提供了一种封装一组一主题的单独的工厂的方法。它在需要创建一系列相互关联或相互依赖的对象时特别有用。通过使用抽象工厂模式,可以确保一个应用程序在不同的系列中始终使用同一个系列的对象,从而保持了系统的一致性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具