建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式

官方:将一个复杂对象的构建层与其表示层相互分离、同样的构建过程可采用不同的表示。
个人理解:建造者模式相对工厂模式更多的就是把功能拆分成不同业务类、然后聚合成一个业务类统一输出、更适合去写业务、这样扩张性、延伸性都好、解耦、如果使用一个工厂模式那就将庞大的业务聚合在一块了、拆分成不同的类去聚焦实现过程、当然最终产生的依然是对象实列!、

建造者模式和工厂模式的区别

  • 注重点不同:建造者模式更注重 方法的调用顺序,工厂模式 注重于创建产品,不关心方法的调用顺序
  • 创建对象的力度不同:建造者可以创建复杂的产品,由各种复杂的部件组成,工厂模式创建的都是相同的实例对象

    案例:求职者对象类

    业务描述:有很多发布者需要在平台发布自己的简历、这就涉及到这个用户的【基本信息】【兴趣爱好】【技能】【特长】【描述】【职位】…..等等

  1. // 实列化姓名类
  2. class HumanNamed{
  3. constructor(name){
  4. this.wholeName = name;
  5. if(name.indexOf(' ') > -1){
  6. this.FirstName = name.slice(0, name.indexOf(' '));
  7. this.secondName = name.slice(name.indexOf(' '));
  8. }
  9. }
  10. }
  11. // 实列化职位类
  12. class work extends HumanNamed{
  13. constructor(name, work){
  14. super(name)
  15. this.getWork(work)
  16. }
  17. getWork(work){
  18. switch(work){
  19. case 'code':
  20. this.work = '工程师'
  21. this.workDescript = '沉浸在编程世界!'
  22. break;
  23. case 'UI':
  24. this.work = '设计师'
  25. this.workDescript = '设计是一门艺术的体现!'
  26. case 'teach':
  27. this.work = '教师'
  28. this.workDescript = '分享知识是一种快乐!'
  29. default:
  30. this.work = work;
  31. this.workDescript = '对不起、我们还不清楚你的职位和职位描述'
  32. }
  33. }
  34. changeWork(work){
  35. this.work = work;
  36. }
  37. changeDescript(setence){
  38. this.workDescript = setence;
  39. }
  40. }
  41. // 创建人 类
  42. class Human extends HumanNamed{
  43. constructor(name, work, skill, hobby) {
  44. super(name, work)
  45. this.skill = skill || '保密';
  46. this.hobby = hobby || '保密';
  47. }
  48. getSkill(){
  49. return this.skill;
  50. }
  51. getHobby(){
  52. return this.hobby;
  53. }
  54. }
  55. /*
  56. * 应聘者建造者(聚合发布者类)
  57. * 参数 name : 姓名(全民)
  58. * 参数 work : 期望职位
  59. * 参数 skill : 技能
  60. * 参数 hobby : 兴趣
  61. */
  62. class Person extends Human {
  63. constructor({name, skill, hobby, work}){
  64. super(name, work, skill, hobby)
  65. }
  66. }
  67. let person = new Person({
  68. name:'张三',
  69. skill:'web',
  70. hobby:'code',
  71. work:'code'
  72. })
  73. console.log(person)

总结

优点

  • 创建和使用分离
  • 封装性好
  • 扩展性好,建造类之间相互独立

    缺点

  • 内部类修改、建造者也需要修改、不符合开闭原则

    使用场景

  • 游戏地图:需要根据地图去渲染场景、比如天空状态晴天还是阴天、然后地图带反光影的树🌲、围栏、路面等等….那如果电脑配置低的可以选择性的移除一些不影响游戏运行的道具比如天空和反光影的树等等、这些都做成不同的类可灵活的配置、插拔方式,动态的根据电脑配置生成适合当前环境运行的场景!

  • 肯德基店,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的”套餐”

    我们利用工厂模式,根据用户不同的选择,来创建不同类型的实例对象(篮球实例、足球类实例、羽毛球等….) 对于建造者模式来说,用户有各种参数、可动态控制生成实例的模样!