[面试题] 简单工厂、工厂方法、抽象工厂有什么区别?
📖 版块 A:知识讲解版 (温故知新)
-
简单工厂:
- 一个工厂类根据参数决定返回哪种产品。
- 适合产品种类少、变化不大的场景。
- 缺点是新增产品通常要修改工厂类,违背开闭原则。
-
工厂方法:
- 把“创建哪种产品”的责任下放给不同具体工厂。
- 新增产品时,通常新增工厂和产品即可。
- 更符合开闭原则。
-
抽象工厂:
- 用于创建一整套相互关联的产品族。
- 比如一套深色主题 UI 组件、一套数据库驱动家族。
- 它关注的不是单个对象,而是“成套对象的一致性”。
-
一句话区别:
- 简单工厂解决“从一堆产品里挑一个”。
- 工厂方法解决“把创建逻辑分散给不同工厂”。
- 抽象工厂解决“成套产品一起创建”。
🎤 版块 B:面试实战版 (高手逐字稿)
Q:简单工厂、工厂方法、抽象工厂有什么区别?
💬 高手逐字稿:
这三个模式本质上都在解决同一个问题:不要把对象创建逻辑直接散落在业务代码里。 但它们应对的复杂度层级是不一样的。
最基础的是简单工厂。你可以把它理解成一个“总调度工厂”,传入不同参数,它返回不同产品。它的优点是使用直观,适合产品种类少、规则简单的场景。但问题也很明显,一旦新增产品,你往往得直接修改这个工厂本身,所以扩展性一般。
再往上一层是工厂方法。它的思路是:不让一个工厂包打天下,而是把“创建什么产品”这件事下放给不同具体工厂。这样新增产品时,通常只需要新增一个产品类和对应工厂类,原有工厂结构不用动,更符合开闭原则。
再复杂一点,就是抽象工厂。它不再只是创建单个对象,而是面向“产品族”。比如你不是只创建一个按钮,而是要同时创建一整套深色主题下的按钮、输入框、下拉框;或者你不是只切换一个驱动,而是整套数据库相关对象都要一起切换。这时候抽象工厂最合适。
所以我一般会这么总结它们的层级关系:
- 简单工厂:一个工厂分发多个产品;
- 工厂方法:多个工厂各自负责一种产品;
- 抽象工厂:一个工厂负责一整套相关产品族。
它们没有绝对谁更高级,而是看你的业务到底复杂到哪一步。
最后更新于: