设计模式之生成器模式
1. 定义
分步骤创建复杂对象,使用相同的创建代码生成不同类型和形式的对象(又译作建造者模式)
2. 口语化举例
生产一台电脑,通常而言不是一蹴而就的,电脑太复杂了
所以会把电脑分为几个主要部件进行单独制造,最后拼在一起,可以理解为组装台式电脑,比如CPU主要由AMD和Intel生产,显卡主要由英伟达和AMD生产,主板、电源、内存、硬盘等也有各自的生产商,将这些零件组合在一起,才是一台合格的电脑产品
分组件、分批次制造,最后组合在一起形成最后的产品,这就是生成器模式(建造者模式)
为啥不直接一次性制造好呢?答曰:电脑这个产品太复杂了,实在难以一次性制造完毕
这也是生成器模式与工厂模式(简单工厂、工厂方法)的主要区别:生成器模式主要解决的是复杂产品,工厂方法模式主要解决的是形式多样但通常简单的产品
(下面的描述会沿用这个上述这个场景)
3. 源码示例
Cesium.js是一个著名的、基于WebGL的GIS前端框架
基于WebGL就不得不提WebGL(OpenGL)的基础概念,比如Shader、Shader Program等
Cesium渲染模块中的Shader对象包含从创建GLSL到创建Shader Program整个流程
流程大致为:
- Cesium中支持分段编写GLSL代码,包括ShaderStruct、ShaderFunction、ShaderDestination
- 将分段的代码组合成GLSL,即ShaderSource
- ShaderBuilder使用ShaderSource创建的ShaderProgram会缓存起来,即ShaderCache
- 需要新的ShaderProgram时,先查询缓存中是否有,有就复用,无则创建
综上,ShaderBuilder就是使用了生成器模式,用来构造Shader
4. 总结
4.1 设计原则
-
单一职责原则
制造CPU的只负责造CPU,制造显卡的只负责制造显卡
-
代码复用,分步骤创建
造出来的CPU可以在这台电脑使用,也可以拆下来换到另一台电脑上使用
4.2 适用场景
-
避免重叠构造函数的出现,即避免多次函数重载
可以自由的组装电脑,而不是设定具体的电脑生成步骤
-
创建不同形式的产品
-
构造组合对象或复杂对象