设计模式之生成器模式

1. 定义

分步骤创建复杂对象,使用相同的创建代码生成不同类型和形式的对象(又译作建造者模式

2. 口语化举例

生产一台电脑,通常而言不是一蹴而就的,电脑太复杂了

所以会把电脑分为几个主要部件进行单独制造,最后拼在一起,可以理解为组装台式电脑,比如CPU主要由AMD和Intel生产,显卡主要由英伟达和AMD生产,主板、电源、内存、硬盘等也有各自的生产商,将这些零件组合在一起,才是一台合格的电脑产品

分组件、分批次制造,最后组合在一起形成最后的产品,这就是生成器模式(建造者模式)

为啥不直接一次性制造好呢?答曰:电脑这个产品太复杂了,实在难以一次性制造完毕

这也是生成器模式与工厂模式(简单工厂、工厂方法)的主要区别:生成器模式主要解决的是复杂产品,工厂方法模式主要解决的是形式多样但通常简单的产品

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

3. 源码示例

Cesium.js是一个著名的、基于WebGL的GIS前端框架

基于WebGL就不得不提WebGL(OpenGL)的基础概念,比如Shader、Shader Program等

Cesium渲染模块中的Shader对象包含从创建GLSL到创建Shader Program整个流程

流程大致为:

image-20230309155628504

  • Cesium中支持分段编写GLSL代码,包括ShaderStruct、ShaderFunction、ShaderDestination
  • 将分段的代码组合成GLSL,即ShaderSource
  • ShaderBuilder使用ShaderSource创建的ShaderProgram会缓存起来,即ShaderCache
  • 需要新的ShaderProgram时,先查询缓存中是否有,有就复用,无则创建

综上,ShaderBuilder就是使用了生成器模式,用来构造Shader

4. 总结

4.1 设计原则

  • 单一职责原则

    制造CPU的只负责造CPU,制造显卡的只负责制造显卡

  • 代码复用,分步骤创建

    造出来的CPU可以在这台电脑使用,也可以拆下来换到另一台电脑上使用

4.2 适用场景

  • 避免重叠构造函数的出现,即避免多次函数重载

    可以自由的组装电脑,而不是设定具体的电脑生成步骤

  • 创建不同形式的产品

  • 构造组合对象或复杂对象

5. 参考资料

[1] 建造者设计模式(生成器模式) (refactoringguru.cn)

[2] Cesium渲染模块之Shader - 当时明月在曾照彩云归 - 博客园 (cnblogs.com)

posted @ 2023-10-27 22:53  当时明月在曾照彩云归  阅读(9)  评论(0编辑  收藏  举报