设计模式之简单工厂模式

1. 定义

提供一个统一的接口来创建不同类型的对象,隐藏了对象的创建细节

2. 口语化举例

工厂里组装台灯,流程、配件等有多种方式,每种台灯有自己的生产线

现在,需要某一种台灯,一种方式是直接去找这个台灯的生产线生成,这会令人烦恼,因为寻找是一件无聊而繁琐的事情

另一种方式是成立一个工厂前台,需要什么台灯就只需要给前台说明,前台会告诉对应的生产线,并将生产好的台灯交付给你

这流程就简单多了,不管是谁来,他都只需和前台联系,然后工厂就会给他对应的产品,这就是简单工厂模式

下面的描述会沿用这个上述这个场景

3. 图表示例

未使用简单工厂模式之前,客户直接找对应的生产线

graph LR 生产线A --> 客户A --> 生产线A 生产线A --> 客户B --> 生产线A 生产线B --> 客户A --> 生产线B 生产线B --> 客户B --> 生产线B 生产线C --> 客户A --> 生产线C 生产线C --> 客户B --> 生产线C

使用简单工厂模式之后,客户只需找工厂前台,工厂前台接受需求并给出产品

graph LR 生产线A --> 工厂前台 生产线B --> 工厂前台 --> 客户A --> 工厂前台 生产线C --> 工厂前台 --> 客户B --> 工厂前台

4. 源码示例

广为人知,Vue使用虚拟DOM,虚拟DOM的节点称为VNode

参考Vue官方文档:渲染函数 & JSX | Vue.js (vuejs.org),创建一个VNode只需要一个h()函数

然而这个VNode是很复杂的,它具有众多的参数、类型,最后它会返回一个VNode

它的调用过程大致如下:

graph LR h函数 --> createVNode函数 --> _createVNode函数 --> createBaseVNode函数

VNode有多种,但是你只需调用h()函数即可获得各种VNode

5. 总结

5.1 设计原则

  • 单一职责原则

    每个生产线只负责生产自己的产品,前台只负责通知调度,职责明确

  • 开闭原则

    要添加新的产品线只需告诉前台即可

5.2 适用场景

  • 无法预知对象确切类别及其依赖关系时, 可使用工厂方法

    无法确定每次具体生产什么,所以前台来协商客户并告知工厂生产线

  • 构建能扩展的软件库或框架的内部组件, 可使用工厂方法

    前台的存在使得要添加新的产品线只需告诉前台即可

  • 复用现有对象来节省系统资源, 而不是每次都重新创建对象, 可使用工厂方法

    前台具有拦截并调度的作用,如果要生产的产品有库存,前台可以直接交付给客户,无需再告诉生产线

6. 参考资料

[1] 工厂方法设计模式 (refactoringguru.cn)

[2] 渲染函数 & JSX | Vue.js (vuejs.org)

posted @ 2023-09-28 23:58  当时明月在曾照彩云归  阅读(13)  评论(0编辑  收藏  举报