简单工厂模式¶
约 747 个字 35 行代码 2 张图片 预计阅读时间 4 分钟
场景:面试受挫的计算器¶
小菜在面向对象语言的面试题里,用 if-else / switch 写了一个“能跑”的计算器,却迟迟没有收到录用通知。大鸟指出:代码无错只是及格线,出题人真正想考察的是 如何用面向对象的方式组织变化。
初学者常犯两类问题:
- 命名与结构:变量名含糊(如
A、B)、缺少异常处理、除零未校验。 - 设计层面:把所有逻辑堆在一个
Main里,用计算机思维而非对象思维描述问题——程序只为满足当前需求,难以维护、扩展与复用。
大鸟用 活字印刷 类比面向对象:刻版印刷改一个字就要整块重刻;活字印刷只需替换单个字模。对应到软件里,就是把 易变的部分 从稳定流程中拆出来,通过多态与封装应对变化。
什么是简单工厂模式¶
简单工厂(Simple Factory)是一种 创建型 编程习惯,不属于 GoF 23 种设计模式,但在工程中极为常见。
其核心思想是:把“实例化哪一个具体类”的决定,集中到一个工厂类中,客户端只向工厂要产品,而不直接 new 具体类。
简单工厂模式(Simple Factory Pattern):用一个工厂类根据参数创建不同产品,返回抽象产品类型。
角色说明¶
| 角色 | 说明 |
|---|---|
| 抽象产品 | 定义产品的公共接口,如 Operation |
| 具体产品 | 实现加减乘除等具体运算 |
| 简单工厂 | 根据运算符创建对应 Operation 实例 |
优点与局限¶
优点:客户端与具体产品解耦;创建逻辑集中,便于维护。
局限:每增加一种运算,通常要 修改工厂类 的 switch,违反 开放-封闭原则。这也是后续引入 工厂方法模式(第 8 章)和 策略模式(第 2 章)的动机。
简单实现¶
Java
// 抽象运算类
abstract class Operation {
double numberA;
double numberB;
abstract double getResult();
}
// 具体运算
class OperationAdd extends Operation {
@Override double getResult() { return numberA + numberB; }
}
class OperationSub extends Operation {
@Override double getResult() { return numberA - numberB; }
}
// ... Mul、Div 类似
// 简单工厂
class OperationFactory {
static Operation createOperate(String operate) {
Operation oper = null;
switch (operate) {
case "+": oper = new OperationAdd(); break;
case "-": oper = new OperationSub(); break;
case "*": oper = new OperationMul(); break;
case "/": oper = new OperationDiv(); break;
}
return oper;
}
}
// 客户端
Operation oper = OperationFactory.createOperate("+");
oper.numberA = 1;
oper.numberB = 2;
double result = oper.getResult();
界面是控制台、Windows 还是 Web,都可以复用上述运算与工厂逻辑——业务封装 与 松耦合 正是简单工厂带来的第一层收益。
与 UML 类图¶
本章还介绍了 UML 类图的基本读法(见 UML 类图):继承(空心三角)、实现(虚线空心三角)、关联、聚合、组合、依赖等关系,是阅读后续各模式结构图的基础。
小结¶
| 要点 | 内容 |
|---|---|
| 本质 | 集中创建对象,返回抽象类型 |
| 适用 | 产品种类少、变化不频繁 |
| 演进 | 变化增多时 → 工厂方法 / 抽象工厂 / 策略 |
