图示:
先举个例子,个人看来,生成器模式的“Client - Director - Builder”相当于小的软件开发公司的“老板 - 产品经理 - 程序员”的模式。
- 老板(Client):
- 决定了公司员工的生死去留(管理其他二者角色的生命周期,负责创建、保留和释放)
- 提需求,公司要做什么项目(调用Director并传递产品需求)
- 验收项目(获取产品)
- 产品经理(Director):
- 知道要做什么项目,依照自定顺序分解成开发模块(从Client获取到产品需求并分解)
- 管理着程序员(Director中包含Builder成员)
- 命令程序员按照模块进行开发(按照顺序调用builder的建造方法进行产品生产)
- 程序员(Builder):
- 新建工程(初始化产品对象)
- 按照需求开发编码(根据Director的调用执行各种生产函数,给产品赋值)
- 开发完毕后提交程序(根据外部调用返回创建完成的产品对象)
示例代码:
使用获取并生产电脑作为示例。稍作解释:
Computer类为Product;ComputerMaker为抽象Builder,AppleComputerMaker和LenovoComputerMaker为实体Builder;ComputerSeller为Director。
代码地址:ComputerMaker
优缺点:
- 优点:
- 拆分模块,解耦合:
- 把创建复杂对象的过程拆分为多个子过程,且由Builder模块独立负责;
- Director只负责创建顺序等业务逻辑,并调用Builder进行生产,稳定性好;
- Client只负责将制定Builder提供给Director,并向Director提出生产要求并获取产品,隐藏了整个生产过程。
- 易扩展:
Builder的抽象父类(或协议)制定所有的子过程,并对外提供获取产品接口,子类Builder实现生产过程。所以,添加新产品时,只要子类化Builder并覆盖创建自己的生产过程即可。Director无需修改。
- 缺点:
- 使用场景少:
- 所有的Builder都是由统一的抽象Builder类继承而来,只能生产一种类型产品,不同产品之间的差异少。
- 生产的产品结构复杂,否则没必要引入此模式。
- 类结构容易庞大:
生产多个产品时,需要创建多个Builder类,类个数易变多。