前言

在前面抽象工厂模式和简单工厂模式,我们更加关注的是实例化出来的对象是什么样子,并不关心中间具体发现了什么,那如果我们更加关注具体创建过程,以及一个类创建过程是极其复杂的并且有许多创建过程是可以复用的那我们这时候再采用前面几种设计模式就会让代码显得极其臃肿。于是建造者模式运势而生。

什么是建造者模式?

在建造者模式中有一个很经典的例子就是,我们需要一个房子,于是我们找到包工头告诉我们需要什么样的房子,包工头本身不会造房子,但是他可以找到工人,我们需要带泳池的房子他就能给我们找到会建造泳池的工人,通过找到不同的工人建造不同的房间最后拼装成房子交付给我们。在这个期间我们是可以查看具体过程的。

也就是说,具体实现过程就比如一个个工人他是一个个单独可以复用的类,我们需要什么样的类的时候我们就可以通过一个类来将这些类组装在一起实现我们想要的类。这样就达到了解耦封装过程和具体创建组件。

具体源码实现

  1. //1.产出东西是房子
  2. //2.包工头调用工人进行开工 而且他要很清楚工人们具体的某一个大项
  3. //3.工人是盖房子的 工人可以建卧室 建客厅 建厨房
  4. //4.包工头只是一个接口而已 他不干活 他只对外说我能建房子
  5. function Fangzi(){//Fangzi可以理解为单例模式
  6. if(!(this instanceof Fangzi)){
  7. return new Fangzi();
  8. }
  9. this.woshi = "";
  10. this.keting = "";
  11. this.chufang = "";
  12. }
  13. function Baogongtou(){
  14. if(!(this instanceof Baogongtou)){
  15. return new Baogongtou();
  16. }
  17. this.jianfangzi = function(gongren){
  18. gongren.jian_chufang();
  19. gongren.jian_keting();
  20. gongren.jian_woshi();
  21. }
  22. }
  23. function Gongren(){
  24. if(!(this instanceof Gongren)){
  25. return new Gongren();
  26. }
  27. this.jian_woshi = function(){
  28. console.log("建卧室");
  29. }
  30. this.jian_keting = function(){
  31. console.log("建客厅");
  32. }
  33. this.jian_chufang = function(){
  34. console.log("建厨房");
  35. }
  36. this.jiaofang = function(){
  37. var _fangzi = new Fangzi();
  38. _fangzi.woshi = "ok";
  39. _fangzi.keting = "ok";
  40. _fangzi.chufang = "ok";
  41. return _fangzi;
  42. }
  43. }
  44. var gongren = new Gongren();
  45. var baogongtou = new Baogongtou();
  46. baogongtou.jianfangzi(gongren);
  47. var myfangzi = gongren.jiaofang();
  48. console.log(myfangzi);

具体用处

优点

  1. 分步创建一个复杂的对象
  2. 解耦封装过程和具体创建组件
  3. 无需关心组件如何组装
  4. 适用于模块复用率高并且对象粒度大的情况下

    缺点

  5. 如果类内部的差异比较大,或者变化复杂的话,你就会增加很多对应的实现类,会使得代码比较臃肿