当前位置: 首页 > news >正文

93、23种设计模式之抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是23种设计模式中的创建型模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,适用于需要保证产品族兼容性、隔离产品创建细节的场景,但扩展新产品种类时需修改核心接口,可能违反开闭原则。 以下是详细介绍:

一、模式定义与核心角色

抽象工厂模式通过抽象接口定义产品族的创建规则,将具体产品的创建延迟到子类实现。其核心包含四个角色:

1.抽象工厂(Abstract Factory)

定义创建产品族的接口,包含多个创建产品的方法(如createButton()、createWindow())。

2.具体工厂(Concrete Factory)

实现抽象工厂接口,负责创建特定产品族的对象(如WindowsFactory创建Windows风格的按钮和窗口)。

3.抽象产品(Abstract Product)

为每种产品定义公共接口(如Button接口的click()方法)。

4.具体产品(Concrete Product)

实现抽象产品接口,由具体工厂创建(如WindowsButton实现Windows按钮的点击行为)。

二、模式特点与优缺点

1.优点

  • 产品族兼容性:确保同一工厂创建的对象风格一致(如Windows工厂生成的按钮和窗口均符合Windows设计规范)。
  • 解耦客户端与实现:客户端仅依赖抽象接口,无需关心具体产品类的创建细节(如切换UI风格时只需更换工厂实例)。
  • 符合开闭原则(部分场景):新增产品族时,只需扩展具体工厂类,无需修改现有代码(如新增Mac风格UI只需添加MacFactory)。

2.缺点

  • 扩展产品种类困难:新增产品类型需修改抽象工厂接口及所有子类(如增加createMenuBar()方法需更新所有工厂类)。
  • 系统复杂性增加:引入多层抽象结构,可能提升理解难度(尤其在产品族和产品等级结构复杂时)。

三、典型应用场景

1.跨平台UI框架

为不同操作系统(Windows、Mac、Linux)创建风格统一的控件(如按钮、文本框),保证界面一致性。

2.数据库访问层

支持多种数据库(MySQL、Oracle、SQL Server),通过抽象工厂屏蔽底层差异,提供统一的数据访问接口。

3.游戏开发

为不同主题或阵营批量生成关联角色、武器和道具(如奇幻主题的精灵、法杖和魔法书)。

4.品牌产品线管理

管理不同品牌(如家电、汽车)的系列产品族,确保产品间功能匹配(如汽车品牌的发动机、轮胎和座椅兼容性)。

四、代码示例(C#)

下面是一个完整的抽象工厂模式在C#中的实现示例,以创建跨平台UI组件为例:

1.定义抽象产品接

// 抽象按钮接口
public interface IButton
{void Render();
}// 抽象复选框接口
public interface ICheckbox
{void Render();
}

2. 创建具体产品实现

// Windows风格按钮
public class WindowsButton : IButton
{public void Render(){Console.WriteLine("渲染Windows风格按钮");}
}// MacOS风格按钮
public class MacOSButton : IButton
{public void Render(){Console.WriteLine("渲染MacOS风格按钮");}
}// Windows风格复选框
public class WindowsCheckbox : ICheckbox
{public void Render(){Console.WriteLine("渲染Windows风格复选框");}
}// MacOS风格复选框
public class MacOSCheckbox : ICheckbox
{public void Render(){Console.WriteLine("渲染MacOS风格复选框");}
}

3. 定义抽象工厂接口

public interface IUIFactory
{IButton CreateButton();ICheckbox CreateCheckbox();
}

4. 创建具体工厂实现

// Windows UI工厂
public class WindowsUIFactory : IUIFactory
{public IButton CreateButton(){return new WindowsButton();}public ICheckbox CreateCheckbox(){return new WindowsCheckbox();}
}// MacOS UI工厂
public class MacOSUIFactory : IUIFactory
{public IButton CreateButton(){return new MacOSButton();}public ICheckbox CreateCheckbox(){return new MacOSCheckbox();}
}

5. 客户端代码

public class Application
{private IButton button;private ICheckbox checkbox;public Application(IUIFactory factory){button = factory.CreateButton();checkbox = factory.CreateCheckbox();}public void RenderUI(){button.Render();checkbox.Render();}
}class Program
{static void Main(string[] args){// 根据当前操作系统选择工厂IUIFactory factory;if (Environment.OSVersion.Platform == PlatformID.Win32NT){factory = new WindowsUIFactory();}else{factory = new MacOSUIFactory();}// 创建应用并渲染UIvar app = new Application(factory);app.RenderUI();/* 输出示例(在Windows上):渲染Windows风格按钮渲染Windows风格复选框*/}
}

五、模式对比与扩展

1.与工厂方法模式的区别

  • 工厂方法模式针对单个产品等级结构(如仅创建按钮),抽象工厂模式针对多个产品等级结构(如同时创建按钮和窗口)。
  • 工厂方法模式的每个产品系列对应一个工厂类,抽象工厂模式的一个工厂类可创建多个相关产品。

2.扩展策略

  • 结合单例模式:确保每个具体工厂类只有一个实例,避免重复创建(如数据库连接池工厂)。
  • 结合建造者模式:处理复杂产品的构建细节(如游戏角色生成时,抽象工厂创建角色骨架,建造者模式填充属性)。

在这里插入图片描述

http://www.dtcms.com/a/335007.html

相关文章:

  • 【读论文】医疗AI大模型:百川开源Baichuan-M2
  • 23. CommonJS 和 ES6 Module 区别
  • 19.3 Transformers量化模型极速加载指南:4倍推理加速+75%显存节省实战
  • ArrayList的contains问题
  • 【C++学习篇】:基础
  • Markdown 生成 Gantt 甘特图
  • STM32硬件SPI配置为全双工模式下不要单独使用HAL_SPI_Transmit API及HAL_SPI_TransmitReceive改造方法
  • 【图像算法 - 14】精准识别路面墙体裂缝:基于YOLO12与OpenCV的实例分割智能检测实战(附完整代码)
  • 人工智能之数学基础:条件独立
  • AI提升SEO关键词搜索效果
  • UDP/TCP套接字编程简单实战指南
  • 数据结构 栈与队列
  • Tomcat配置文件深度解析
  • [安洵杯 2019]Attack
  • STM32F407VET6开发板标准库实现DMA空闲接收和发送
  • 同创物流学习记录2·电车光电
  • 行为型设计模式:对象协作的舞蹈家(中)
  • Rust 入门 KV存储HashMap (十七)
  • 如何得知是Counter.razor通过HTTP回调处理的还是WASM处理的,怎么检测?
  • LeetCode 55.跳跃游戏:贪心策略下的可达性判断
  • 2025年睿抗国赛本科组题解
  • JavaScript 数组方法汇总
  • 第四章 数字特征
  • 数智管理学(四十七)
  • 【论文笔记】Multi-Agent Based Character Simulation for Story Writing
  • Kafka 面试题及详细答案100道(11-22)-- 核心机制1
  • 算法题打卡力扣第42题接雨水(hard)
  • 【图像算法 - 15】智能行李识别新高度:基于YOLO12实例分割与OpenCV的精准检测(附完整代码)
  • 一次性能排查引发的Spring MVC深度思考
  • Netty 的 Select/Poll 机制核心实现主要在 NioEventLoop 的事件循环