# 建造者模式

  1. 定义:注重创建对象的细节,用于创建出复杂对象或者复合对象
  2. 例子
var data = [
    {
        name: 'zhang san',
        age: 23,
        work: 'engineer'
    },
    ...
]

// 普通写法
function Candidate(param){
    var _candidate = {}
    _candidate.name = param.name
    _candidate.age = param.age
    _candidate.firstName = _candidate.name.split(' ')[0]
    _candidate.secondName = _candidate.name.split(' ')[1]
    
    switch(param.work){
        case 'engineer':
            _candidate.work.name = '工程师'
            _candidate.work.desc = '热爱编程'
            break;
        ...
        default:
            _candidate.work.name = param.work
            _candidate.work.desc = '无'
            break;
    }
    
    _candidate.work.changeWork = function(work){
        this.name = work
    }
    _candidate.work.changeDesc = function(desc){
        this.desc = desc
    }
    
    var candidateArr = []
    for(var i = 0; i < data.lenght; i++){
        candidateArr[i] = Candidate(data[i])
    }
    console.log(candidateArr)
    /*
    console.log(candidateArr[0])
    输出;
    Object
        age:23
        firstName:"zhang"
        name:"zhang san"
        secondName:"san"
        work:
            changeDes:f(des)
            changeWork:f(work)
            description:"热爱编程"
            name:"工程师"
            _proto_:Object
        _proto_:Object    
    */
    candidateArr[0].work.changeWork('xxx')
}

// 建造者模式,最外层只有4行代码;将对象再进行封装,抽象CreateName类,CreateWork类,这样就创建了复杂的类
function Candidate(param){
    var _candidate = new Person(param)
    _candidate.name = new CreateName(param.name)
    _candidate.eork = new CreateWork(param.work)
    return _candidate
}
function Person(param){
    this.name = param.name
    this.age = param.age
}
function CreateName(name){
    this.wholeName = name
    this.firstName = name.split(' ')[0]
    this.secondName = name.split(' ')[1]
}
function CreateWork(work){
    switch(work){
        case 'engineer':
            this.name = '工程师'
            this.desc = '热爱编程'
            break;
        ...
        default:
            this.name = work
            this.desc = '无'
            break;
    }
}
CreateWork.prototype.changeWork = function(work){
    this.name = work
}
CreateWork.prototype.changeDesc = function(desc){
    this.desc = desc
}

var candidateArr = []
for(var i = 0; i < data.lenght; i++){
    candidateArr[i] = Candidate(data[i])
}
console.log(candidateArr)
candidateArr[0].work.changeWork('xxx')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102