建造者模式

  • 建造者模式注重创建对象的细节,使用这种模式创建出的复杂对象或者复合对象结构会非常清晰
  • 举个例子:比如有一家招聘中介公司,现在有一批纸质简历或者简历数据信息,为了做成统一的电子版简历,我们需要将这些信息进行整理,我们该怎么去做
  1. var data = [
  2. {
  3. name: '张三',
  4. age: 24,
  5. work: 'engineer'
  6. },
  7. {
  8. name: "李四",
  9. age: 30,
  10. work: 'teacher'
  11. },
  12. {
  13. name: '王五',
  14. age: 28,
  15. work: 'xxx'
  16. }
  17. ]
  18. //普通写法——不是建造者模式
  19. function Candidate(param){
  20. var _candidate = {};
  21. _candidate.name = param.name;
  22. _candidate.age = param.age;
  23. _candidate.firstName = _candidate.name.split("")[0];
  24. _candidate.secondName = _candidate.name.substr(1);
  25. _candidate.work = {};
  26. switch(param.work) {
  27. case 'engineer':
  28. _candidate.work.name = '工程师';
  29. _candidate.work.description = '容易秃头';
  30. break;
  31. case 'teacher':
  32. _candidate.work.name = '老师';
  33. _candidate.work.description = '乐于分享';
  34. break;
  35. default:
  36. _candidate.work.name = param.work;
  37. _candidate.work.description = '无';
  38. }
  39. _candidate.work.changeWork = function(work){
  40. this.name = work;
  41. }
  42. _candidate.work.changeDes = function(des){
  43. this.description = des;
  44. }
  45. return _candidate;
  46. }
  47. var candidateArr = [];
  48. for(var i = 0; i < data.length;i++) {
  49. candidateArr[i] = Candidate(data[i]);
  50. }
  51. console.log(candidateArr);
  52. //使用建造者模式
  53. function Candidate(param){
  54. var _candidate = new Person(param);
  55. _candidate.name = new CreateName(param.name);
  56. _candidate.work = new CreateWork(param.work);
  57. return _candidate;
  58. }
  59. function Person(param){
  60. this.name = param.name;
  61. this.age = param.age;
  62. }
  63. function CreateName(name){
  64. this.wholeName = name;
  65. this.firstName = name.split("")[0];
  66. this.secondName = name.substr(1);
  67. }
  68. function CreateWork(work){
  69. switch(work) {
  70. case 'engineer':
  71. this.name = '工程师';
  72. this.description = '容易秃头';
  73. break;
  74. case 'teacher':
  75. this.name = '老师';
  76. this.description = '乐于分享';
  77. break;
  78. default:
  79. this.name = work;
  80. this.description = '无';
  81. }
  82. }
  83. CreateWork.prototype.changeWork = function(work){
  84. this.name = work;
  85. }
  86. CreateWork.prototype.changeDes = function(des){
  87. this.description = des;
  88. }
  89. var candidateArr = [];
  90. for(var i = 0; i < data.length;i++) {
  91. candidateArr[i] = Candidate(data[i]);
  92. }
  93. console.log(candidateArr);