在软件设计师考试的综合知识科目中,设计模式是面向对象设计部分的核心考点之一。其中,工厂模式(Factory Pattern) 和 抽象工厂模式(Abstract Factory Pattern) 作为创建型模式的代表,因其在实际开发中的广泛应用,成为历年考试的重点与难点。本文将对这两种模式的考点进行系统分析,帮助考生高效备考。
一、核心概念辨析:从工厂到抽象工厂
- 工厂模式(又称工厂方法模式)
- 定义:定义一个用于创建对象的接口,但让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
- 核心角色:抽象产品、具体产品、抽象工厂(或创建者)、具体工厂。
- 核心思想:“单一产品族” 的创建。它将对象的创建过程封装在工厂类中,客户端只依赖抽象产品接口和抽象工厂,与具体产品的实现解耦。
- 考试要点:识别符合工厂方法模式结构的类图;理解其解耦客户端与具体类、支持“开闭原则”(对扩展开放,对修改封闭)的优点。
- 抽象工厂模式
- 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- 核心角色:抽象产品族、具体产品族、抽象工厂、具体工厂。
- 核心思想:“多个产品族” 的创建。它强调的是“家族”概念,一个具体工厂负责创建属于同一风格或平台的一整套产品(例如,不同操作系统下的按钮、文本框、滚动条等界面组件)。
- 考试要点:区分其与工厂方法模式的关键差异(产品族 vs. 单一产品);理解其如何支持产品族的一致性配置;掌握其类图结构,特别是抽象工厂接口中声明多个创建方法的特点。
二、关键考点与对比分析
考试中常通过选择题或设计题,考察考生对两种模式的理解与区分:
| 对比维度 | 工厂模式(Factory Method) | 抽象工厂模式(Abstract Factory) |
| :--- | :--- | :--- |
| 创建目标 | 一种产品对象 | 一族相关的产品对象 |
| 抽象层次 | 通过子类化创建对象(类模式) | 通过对象组合创建对象族(对象模式) |
| 扩展方向 | 增加新的具体产品时,需增加新的具体工厂。 | 增加新的产品族容易(新增具体工厂),但增加新的产品种类困难(需修改所有工厂接口)。 |
| 结构特点 | 一个创建方法对应一个产品。 | 一个工厂接口包含多个创建方法,对应一个产品族中的多个产品。 |
| 典型应用场景 | 连接器(如数据库连接)、日志记录器。 | 跨平台UI组件库(如Windows/Mac风格控件)、游戏场景(不同风格的角色、武器、建筑)。 |
高频考点:
1. 情景判断题:给定一个软件需求描述(如“需要支持多种数据库访问,且未来可能增加新数据库”),要求选择最合适的设计模式。通常,工厂模式适用于单一产品类型的变化(如不同的Connection对象),而抽象工厂适用于成套产品的切换(如整套数据库访问组件Connection, Command, Adapter)。
2. 类图识别题:给出UML类图,要求识别使用的是哪种模式。关键看是否存在一个抽象工厂接口,以及该接口是否声明了多个创建不同产品对象的方法。
3. 优缺点分析:理解抽象工厂模式便于交换产品系列(例如从Windows风格切换到Mac风格),但难以支持新增产品种类(如在UI组件中新增一种“滑块”控件)的原因。
三、备考策略与解题思路
- 紧扣定义与意图:遇到题目时,首先回想模式的官方定义和设计意图。工厂模式的意图是“将实例化延迟到子类”,抽象工厂的意图是“创建一系列相关对象”。
- 分析“变化点”:判断题目中需要封装的变化是什么。如果变化点是“具体对象的类型”(例如,是创建
MySQLConnection还是OracleConnection),考虑工厂模式。如果变化点是“整个产品家族的风格或平台”(例如,是创建一套WinButton+WinText还是MacButton+MacText),考虑抽象工厂模式。 - 结合设计原则:两种模式都体现了依赖倒置原则(依赖抽象,而非具体)和开闭原则。在分析时,可以思考哪种模式能更好地应对题目中描述的未来扩展需求。
四、
掌握工厂模式与抽象工厂模式,不仅是应对软件设计师考试的关键,更是提升实际软件设计能力的重要一环。考生需从概念本质、结构差异、适用场景及优缺点等多个维度进行深入理解,并通过历年真题进行巩固练习,做到举一反三,方能在考试中从容应对相关题目,为成为一名合格的软件设计师打下坚实的基础。