跳转至

简单工厂模式

约 747 个字 35 行代码 2 张图片 预计阅读时间 4 分钟

场景:面试受挫的计算器

小菜在面向对象语言的面试题里,用 if-else / switch 写了一个“能跑”的计算器,却迟迟没有收到录用通知。大鸟指出:代码无错只是及格线,出题人真正想考察的是 如何用面向对象的方式组织变化

初学者常犯两类问题:

  1. 命名与结构:变量名含糊(如 AB)、缺少异常处理、除零未校验。
  2. 设计层面:把所有逻辑堆在一个 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 类图):继承(空心三角)、实现(虚线空心三角)、关联、聚合、组合、依赖等关系,是阅读后续各模式结构图的基础。

小结

要点 内容
本质 集中创建对象,返回抽象类型
适用 产品种类少、变化不频繁
演进 变化增多时 → 工厂方法 / 抽象工厂 / 策略

评论