系统架构技能之设计模式-抽象工厂模式 📅 发布时间:2026/7/5 3:20:59 👁️ 浏览次数: 上篇回顾上篇我们主要讲述了简单工厂模式和工厂模式。并且分析了每种模式的应用场景和一些优缺点我们现在来回顾一下简单工厂模式一个工厂负责所有类型对象的创建不支持无缝的新增新的类型对象的创建。工厂模式多个工厂负责多个类型对象的创建每个工厂只负责具体类型对象的创建支持无缝的新增类型对象的创建需要实现工厂接口类和具体的类型对象类。我们来简单的对比下这2个模式的优缺点模式名称优点缺点简单工厂模式一个工厂负责所有对象的创建简单灵活不符合高内聚的原则不支持无缝的扩展工厂模式可以无缝的新增类型每个工厂职责单一符合高内聚的原则工厂类太多难以维护。工厂模式很优雅的解决了应用程序使用对象时的无限new()的操作同时降低了系统应用之间的耦合性提高了系统的可维护性和适应性。二、摘要本文主要是针对创建型模式中的抽象工厂模式进行讲述抽象工厂模式是在简单工厂模式的基础上扩展而成的新模式将简单工厂中的对象的创建过程进行了很优雅的动态配置来完成无缝的扩展当然通过一些扩展可以构建出可支持动态新增或者删除对象的抽象工厂模式。本文将会给出具体的实现方案相比工厂模式抽象工厂模式是一个工厂负责多个对象的创建返回的具体的类型是这个对象的抽象类型。这样在客户端引用的时候只需要使用这个工厂返回的对象类型抽象工厂会自动根据对象的类型动态的创建这个类型对象的实例。大体的过程如下上面的图片呢主要是针对经典的抽象工厂模式给出了一个实现草图的模拟而我们在实际的项目中可能并不希望给出这么多的抽象工厂工厂实现我只想给出一个通用的抽象工厂实现通过静态方法直接调用返回我想要的对象类型的实例而且这个对象类型是可以动态配置的那么我们如何做到呢这就是本篇需要讨论的实现方案。本篇将会从以下几点进行讲述抽象工厂模式1、抽象工厂模式的简单实例代码-这里给出的是经典的抽象工厂模式实例代码。我们从经典的实例代码中可以看出这个工厂模式的一些缺点。2、根据经典工厂模式的缺点我们给出改进的方案进一步给出项目中可以使用的通用方案实现。3、给出上篇中的通过委托来实现的工厂模式方案。4、通过特性反射的形式来动态的创建对象。三、本文大纲a、上篇回顾。b、摘要。c、本文大纲。d、抽象工厂模式的特点及使用场景。e、抽象工厂模式的实现方案。f、抽象工厂模式使用总结。g、系列进度。h、下篇预告。四、抽象工厂模式的特点及使用场景抽象工厂可以说是三类工厂模式中使用最广泛的也是最受大家喜爱的模式之一因为抽象工厂模式解决了一系列相互依赖的对象或者有组合关系的对象的创建过程。举个简单的例子来说我们以电脑的显卡和风扇来说吧我们知道显卡一般在玩游戏的时候由于渲染图形会产生大量的热量如果没有好的风扇那么可能无法达到好的散热的效果这个时候我们可以把显卡和风扇的创建放在一个抽象工厂中进行创建因为这2个对象是具有依赖关系的对象那么我们来给出这个例子的完整实例代码先看看2个对象类型的接口和抽象工厂的接口定义/// summary/// 定义显卡抽象对象接口/// /summarypublic interface IDisplayCard{}/// summary/// 定义显卡风扇抽象对象接口/// /summarypublic interface IDisplayFan{}/// summary/// 定义显卡设备抽象工厂接口/// /summarypublic interface IAbstractDriveFactory{IDisplayCard CreateDisplayCard();IDisplayFan CreateDisplayFan();}我们来看看具体类型的实现和抽象工厂的具体实现。/// summary/// 定义华硕显卡的具体对象/// /summarypublic class DisplayCardAsus : IDisplayCard{}/// summary/// 华硕显卡配套风扇/// /summarypublic class DisplayFanAsus : IDisplayFan{}/// summary/// 华硕显卡具体实现工厂/// /summarypublic class DriveFactoryAsus : IAbstractDriveFactory{IDisplayCard CreateDisplayCardAsus(){return new DisplayCardAsus();}IDisplayFan CreateDisplayFanAsus(){return new DisplayFanAsus();}}通过上面的代码我们给出了抽象工厂的一个经典实例的实现方案当然这不是我们开发中使用的实际形式那么实际我们在项目中如何使用这个抽象工厂模式呢我们一般是改进的方案去使用这个抽象工厂模式我们如何改进呢对于目前的如果我不光创建显卡设备和配套的风扇设备我还想创建其他的类型的东西这时候可能我们定义的抽象工厂就无法满足具有相互依赖或者组合关系的对象类型实例的创建工作了那么我们如何改进呢这就是下面要讲述的几类方案。五、抽象工厂模式的实现方案5.1、通过配置文件来实现我们先给出基于上面的经典抽象工厂的一个改进的方案可以支持动态配置的抽象工厂一个工厂负责动态的创建一些列的可动态配置的对象列表我们如何做呢我想一提到配置。大家都知道要么是通过XML文件来实现或者是通过泛型集合来做。我们这里可以提供的方案是这样的通过工厂初始化时从配置文件中读取配置项构造一个字典然后从这个字典中查询要创建的类型是否在字典中如果在字典中存在则创建这个类型的对象否则返回NULL我们这里通过泛型来实现。我们来看看具体的代码实现吧/// summary/// 定义抽象工厂接口/// /summarypublic interface IAbstractFactory{/// summary/// 通用的泛型对象创建工厂/// /summary/// typeparam nameT/typeparam/// returns/returnsT CreateT();}给出具体的实现这个接口的抽象工厂类/// summary/// 具体的通用工厂实现/// /summarypublic class AbstractFactory : IAbstractFactory{private static readonly IDictionaryType, Type instances null;public static AbstractFactory(){//从具体的配置项中读取从配置文件中读取或者通过某个方法来硬编码实现等。//这里推荐的做饭是从配置文件中读取。instances new DictionaryType, Type();instances.Add(Type.GetType(), Type.GetType());instances.Add(Type.GetType(), Type.GetType());}public T CreateT(){if (!instances.ContainsKey(typeof(T)))return default(T);Type typeInstance instances[typeof(T)];T obj (T)Activator.CreateInstance(typeInstance);return obj;}}通过上面给出的代码基本上可以满足一般项目的需求大家当然有好的思路和建议也可以提出给出更好的改进方案下面我给出大概的配置文件格式其实就是父子级节点父级节点是负责创建的工厂类那么这个父节点下的子节点就是工厂要创建的具体的对象类型。上图中描述的思路我们大概知道了对应这样的一个支持多个具有依赖关系或者组合关系的对象的动态抽象工厂的实现那么如果我们想实现支持多个具有依赖关系或者组合关系的不同的创建形式的通用创建工厂时我们如何来做呢同上面的思路只不过我们外部需要再添加一个字典负责类型和抽象工厂的映射即抽象工厂可以创建的字典列表及抽象工厂具体实例类型之间的键值对关系或者通过配置文件来组织父子级的关系。我们大概的看下配置文件的组织吧?xml version1.0 encodingutf-8 ?AbstractFactoryFactorySectionsFactorySection nameProductFactory typeDesignPattern.ProductFactoryObjectInstance name type/ObjectInstance name type/ObjectInstance name type/ObjectInstance name type//FactorySectionFactorySection nameFoodFactory typeDesignPattern.FoodFactoryObjectInstance name type/ObjectInstance name type/ObjectInstance name type/ObjectInstance name type//FactorySectionFactorySection nameBookFactory typeDesignPattern.BookFactoryObjectInstance name type/ObjectInstance name type/ObjectInstance name type/ObjectInstance name type//FactorySection/FactorySections/AbstractFactory
【全网最详细】Inventor 2027下载免费版 Inventor三维机械设计软件安装图解(2026最新) 文章目录前言Inventor 2027 下载Inventor 2027 安装教程Inventor 2027怎么创建参数化零件?一步步教你操作步骤前言 说到三维机械设计,搞过工业建模的朋友对 Autodesk Inventor 应该不陌生。Inventor Professional 2027(简称 Inventor Pro 20… 2026/7/5 3:20:59
多层金属的“异质变形“为什么是矫平工艺的终极难题? 在金属板材加工领域,复合板(又称金属层状复合材料)正越来越多地应用于石油化工、海洋工程、核电和食品制药等行业。校平机作为消除板材残余应力、恢复平整度的关键设备,在面对复合板时遇到了与单质金属完全不同的技术挑战。复合板… 2026/7/5 3:16:58
opencode最新版本安装使用 1.中文官网文档 https://opencode.ai/zh 2.安装步骤(windows推荐使用) win R 打开windows命令终端,执行安装命令 curl -fsSL https://opencode.ai/install | bash通过安装结果,opencode的环境变量没有写入成功,我… 2026/7/5 3:14:57
一体机正在悄悄改变这5个行业 提到一体机,很多人想到的是办公电脑。但你可能没注意到,一体机正在进入越来越多的行业,改变着这些行业的日常运作方式。 一、政务窗口:从“排队等候”到“即来即办” 过去去政务大厅办事,排队是常态。窗口工作人员在传… 2026/7/5 4:35:16
G-Eval突破性实践:GPT-4驱动的NLG评估如何实现人机对齐创新 G-Eval突破性实践:GPT-4驱动的NLG评估如何实现人机对齐创新 【免费下载链接】geval Code for paper "G-Eval: NLG Evaluation using GPT-4 with Better Human Alignment" 项目地址: https://gitcode.com/gh_mirrors/ge/geval 在自然语言生成技术飞… 2026/7/5 4:33:16
6款实用降AI率软件 合规程度拉满 写论文时总担心AI生成痕迹太重?别慌,这里整理了6款超实用的免费论文降AI率工具,堪称解决AI痕迹问题的"效率利器"。它们能有效识别并消除AI生成特征,降痕效果显著,帮你轻松通过审核,彻底告别高AI率… 2026/7/5 4:31:16
3个高效文件同步场景解析:ChoEazyCopy实战应用指南 3个高效文件同步场景解析:ChoEazyCopy实战应用指南 【免费下载链接】ChoEazyCopy Simple and powerful RoboCopy GUI 项目地址: https://gitcode.com/gh_mirrors/ch/ChoEazyCopy 还在为复杂的RoboCopy命令行参数而头疼吗?ChoEazyCopy作为RoboCop… 2026/7/5 4:31:16
原来碳晶板集成墙板有这么多品牌,到底该怎么选? 在装修时,碳晶板集成墙板因安装便捷、风格多样等优势,受到不少消费者青睐。面对众多品牌,我们该如何选择呢?下面为大家提供一些参考。环保性能是关键环保是装修的重要考量因素。像康品集成墙板,采用木塑材质复合而成&a… 2026/7/5 4:29:15
抖店1688选品中心怎么用新手怎么筛一件代发货源 抖店1688选品中心怎么用?新手怎么筛一件代发货源 抖店新手做无货源,最容易卡在选品:1688 商品很多,但不是所有货源都适合抖店一件代发。选错货源后,后面会出现缺货、发货慢、售后高、利润低等问题。 所以使用 1688 选品… 2026/7/5 4:29:15
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/5 0:01:32
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/5 0:01:32
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/5 0:05:36