js设计模式 工厂模式

第一次学习设计模式 - 工厂模式

相关资料:

JavaScript设计模式总结

js设计模式-工厂模式

创建三个角色然后随机决斗⚔️

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
103
104
105
106
107
108
109
110
111
112
console.log('工厂模式');

// 攻击力1-100
const attackPower = () => Math.floor(Math.random() * 100 + 1)

// 战士
class Warrior {
constructor() {
this.occupation = '战士'
this.skill = '单一狂砍'
this.blood = 100
this.hit = attackPower()
// other
}
}

// 法师
class Mage {
constructor() {
this.occupation = '法师'
this.skill = '集体冰冻'
this.blood = 100
this.hit = attackPower()
}
}

// 射手
class Archer {
constructor() {
this.occupation = '射手'
this.skill = '全局轰炸'
this.blood = 100
this.hit = attackPower()
}
}

// 工厂对象
// class、function、object
class RoleFactory {
constructor() {}
createRole(role) {
let roles = {
Warrior: Warrior,
Mage: Mage,
Archer: Archer
}

const Character = roles[role]
return role ? new Character() : new Warrior()

}
}

// 创建角色
let roleFactory = new RoleFactory
let warrior = roleFactory.createRole('Warrior')
let mage = roleFactory.createRole('Mage')
let archer = roleFactory.createRole('Archer')

console.log('warrior:', warrior);
console.log('mage:', mage);
console.log('archer:', archer);

console.log('----------')

// 随机角色
const randomRole = (data, number) => {
if (!data || !data.length || !number) return

let randomRole = []

for (let i = 0; i < data.length; i++) {
let sub = Math.floor(Math.random() * data.length )
randomRole.push(...data.splice(sub, 1))
}
return randomRole
}

// 战斗
const duel = roles => {
// 最强角色
let maxRole = null
// 最高攻击力
let maxHit = -1
roles.map(item => {
console.log(item)
// 如果攻击力大于最大攻击力
if (item.hit > maxHit) {
// 设置当前角色
maxRole = item
// 攻击力也替换
maxHit = item.hit
} else if (item.hit === maxHit) {
// 清空
maxRole = null
maxHit = -1
}

})

return maxRole
}

const compose = (...fn) => fn.reduce((a, b) => (...args) => a(b(...args)))

let winner = compose(duel, randomRole)([warrior, mage, archer], 2)

if (winner) {
console.log(`胜利者是: ${winner.occupation}, 他的技能是: ${winner.skill}, 攻击力: ${winner.hit}`)
} else {
console.log(`这是平局`)
}

输出

1
2
3
4
5
6
7
8
工厂模式
warrior: Warrior { occupation: '战士', skill: '单一狂砍', blood: 100, hit: 1 }
mage: Mage { occupation: '法师', skill: '集体冰冻', blood: 100, hit: 39 }
archer: Archer { occupation: '射手', skill: '全局轰炸', blood: 100, hit: 33 }
----------
Warrior { occupation: '战士', skill: '单一狂砍', blood: 100, hit: 1 }
Mage { occupation: '法师', skill: '集体冰冻', blood: 100, hit: 39 }
胜利者是: 法师, 他的技能是: 集体冰冻, 攻击力: 39

因为第一次学习 还不太知道具体的优点和好处 也没办法口喷 所以暂时留个坑给自己 下次更加了解之后回来填坑 🍑

打赏测试