国内开发者福音!GPT-5.2 API 高效稳定接入指南,轻松摆脱网络困扰
2026/1/21 17:39:08
抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建相关或依赖对象族,而无需指定它们具体的类。
简单来说:抽象工厂模式就是创建一系列相关的对象,而不是单个对象。
想象一家家具制造厂:
| 风格 | 椅子 | 沙发 | 桌子 |
|---|---|---|---|
| 现代风格 | 现代椅子 | 现代沙发 | 现代桌子 |
| 古典风格 | 古典椅子 | 古典沙发 | 古典桌子 |
抽象工厂模式可以确保:
工厂方法模式只能创建一种类型的产品。如果需要创建多个相关产品,就需要多个工厂,这样会导致:
┌─────────────────────────┐ │ AbstractFactory │ 抽象工厂 ├─────────────────────────┤ │ + createProductA(): A │ │ + createProductB(): B │ │ + createProductC(): C │ └──────────┬──────────────┘ │ 继承 ├──┬──────────────────┬──────────────┐ │ │ │ ┌──────────┴──────────┐ ┌───────┴───────────┐ ┌───┴────────┐ │ ConcreteFactory1 │ │ ConcreteFactory2 │ │ ... │ 具体工厂 └─────────────────────┘ └───────────────────┘ └────────────┘ ┌─────────────────────────┐ │ AbstractProductA │ 抽象产品A ├─────────────────────────┤ │ + operation(): void │ └──────────┬──────────────┘ │ 继承 ├──┬──────────────────┬──────────────┐ │ │ │ ┌──────────┴──────────┐ ┌───────┴───────────┐ ┌───┴────────┐ │ ProductA1 │ │ ProductA2 │ │ ... │ 具体产品A └─────────────────────┘ └───────────────────┘ └────────────┘ ┌─────────────────────────┐ │ AbstractProductB │ 抽象产品B ├─────────────────────────┤ │ + operation(): void │ └──────────┬──────────────┘ │ 继承 ├──┬──────────────────┬──────────────┐ │ │ │ ┌──────────┴──────────┐ ┌───────┴───────────┐ ┌───┴────────┐ │ ProductB1 │ │ ProductB2 │ │ ... │ 具体产品B └─────────────────────┘ └───────────────────┘ └────────────┘// 抽象产品:形状接口publicinterfaceShape{/** * 绘制形状 */voiddraw();}// 抽象产品:颜色接口publicinterfaceColor{/** * 填充颜色 */voidfill();}// 具体产品:圆形publicclassCircleimplementsShape{@Overridepublicvoiddraw(){System.out.println("绘制圆形");}}// 具体产品:矩形publicclassRectangleimplementsShape{@Overridepublicvoiddraw(){System.out.println("绘制矩形");}}// 具体产品:正方形publicclassSquareimplementsShape{@Overridepublicvoiddraw(){System.out.println("绘制正方形");}}// 具体产品:红色publicclassRedimplementsColor{@Overridepublicvoidfill(){System.out.println("填充红色");}}// 具体产品:绿色publicclassGreenimplementsColor{@Overridepublicvoidfill(){System.out.println("填充绿色");}}// 具体产品:蓝色publicclassBlueimplementsColor{@Overridepublicvoidfill(){System.out.println("填充蓝色");}}/** * 抽象工厂:形状和颜色工厂 * 定义了创建形状和颜色的抽象方法 */publicinterfaceAbstractFactory{/** * 创建形状 * @param shapeType 形状类型 * @return 形状实例 */ShapegetShape(StringshapeType);/** * 创建颜色 * @param colorType 颜色类型 * @return 颜色实例 */ColorgetColor(StringcolorType);}/** * 具体工厂:形状工厂 * 负责创建各种形状 */publicclassShapeFactoryimplementsAbstractFactory{@OverridepublicShapegetShape(StringshapeType){if(shapeType==null){returnnull;}if(shapeType.equalsIgnoreCase("CIRCLE")){returnnewCircle();}elseif(shapeType.equalsIgnoreCase("RECTANGLE")){returnnewRectangle();}elseif(shapeType.equalsIgnoreCase("SQUARE")){returnnewSquare();}returnnull;}@OverridepublicColorgetColor(StringcolorType){// 形状工厂不负责创建颜色returnnull;}}/** * 具体工厂:颜色工厂 * 负责创建各种颜色 */publicclassColorFactoryimplementsAbstractFactory{@OverridepublicShapegetShape(StringshapeType){// 颜色工厂不负责创建形状returnnull;}@OverridepublicColorgetColor(StringcolorType){if(colorType==null){returnnull;}if(colorType.equalsIgnoreCase("RED")){returnnewRed();}elseif(colorType.equalsIgnoreCase("GREEN")){returnnewGreen();}elseif(colorType.equalsIgnoreCase("BLUE")){returnnewBlue();}returnnull;}}/** * 工厂生产者:工厂创建器 * 根据传入的类型返回相应的工厂 */publicclassFactoryProducer{/** * 获取工厂 * @param choice 工厂类型 * @return 工厂实例 */publicstaticAbstractFactorygetFactory(Stringchoice){if(choice.equalsIgnoreCase("SHAPE")){returnnewShapeFactory();}elseif(choice.equalsIgnoreCase("COLOR")){returnnewColorFactory();}returnnull;}}/** * 抽象工厂模式演示类 * 演示如何使用抽象工厂模式创建形状和颜色 */publicclassAbstractFactoryPatternDemo{publicstaticvoidmain(String[]args){System.out.println("=== 抽象工厂模式演示 - 形状和颜色 ===\n");// 获取形状工厂AbstractFactoryshapeFactory=FactoryProducer.getFactory("SHAPE");// 获取颜色工厂AbstractFactorycolorFactory=FactoryProducer.getFactory("COLOR");// 创建形状System.out.println("--- 绘制形状 ---");Shapeshape1=shapeFactory.getShape("CIRCLE");shape1.draw();Shapeshape2=shapeFactory.getShape("RECTANGLE");shape2.draw();Shapeshape3=shapeFactory.getShape("SQUARE");shape3.draw();// 创建颜色System.out.println("\n--- 填充颜色 ---");Colorcolor1=colorFactory.getColor("RED");color1.fill();Colorcolor2=colorFactory.getColor("GREEN");color2.fill();Colorcolor3=colorFactory.getColor("BLUE");color3.fill();System.out.println("\n=== 抽象工厂模式的优势 ===");System.out.println("1. 产品族一致性:可以创建相关的对象族");System.out.println("2. 代码解耦:客户端不需要知道具体创建的是哪个产品");System.out.println("3. 易于扩展:新增产品族时,只需新增对应的工厂类");System.out.println("\n=== 实际应用场景 ===");System.out.println("1. UI组件库:不同风格的按钮、文本框、菜单");System.out.println("2. 数据库访问:不同数据库的连接、命令、参数");System.out.println("3. 游戏开发:不同风格的道具、角色、场景");System.out.println("4. 配置管理:不同环境的配置对象");System.out.println("\n=== 与工厂方法的区别 ===");System.out.println("工厂方法:创建单个对象");System.out.println("抽象工厂:创建对象族(多个相关对象)");System.out.println("\n=== 扩展性说明 ===");System.out.println("新增形状:只需在ShapeFactory中添加新的形状类");System.out.println("新增颜色:只需在ColorFactory中添加新的颜色类");System.out.println("新增产品族:需要修改AbstractFactory接口和所有工厂类");}}| 特性 | 工厂方法 | 抽象工厂 |
|---|---|---|
| 创建对象 | 单个对象 | 对象族(多个相关对象) |
| 工厂数量 | 多个工厂(每个产品一个) | 多个工厂(每个产品族一个) |
| 产品类型 | 一种产品 | 多种相关产品 |
| 扩展性 | 新增产品容易 | 新增产品族容易,新增产品类型困难 |
| 复杂度 | 较简单 | 较复杂 |
⚠️ 抽象工厂模式虽然强大,但不要滥用: