主题
工厂模式
构造器模式
抽象每个对象实例的变与不变
javascript
function User(name, age) {
this.name = name
this.age = age
}
以上例子中,将每个用户都具有的 name、age 这些不变进行封装,同时将 name、age 的赋值操作进行开放,确保了变
简单工厂模式
抽象不同构造函数(类)之间的变与不变,其实就是将创建对象的过程进行封装
比如,现在要在用户的基础上,添加上角色类型,和每个角色对应的工作。那么对应一个用户来说,name、age、role、work 都是不变的共性,这是每个用户都拥有的
javascript
function User(name, age, role, work) {
this.name = name
this.age = age
this.role = role
this.work = work
}
但是,确定 role,就能直接确定 work,所以为了进一步封装,是可以根据 role,创建多个构造函数
javascript
function Coder(name, age) {
this.name = name
this.age = age
this.role = 'coder'
this.work = ['写代码','写系分', '修Bug']
}
function ProductManager(name, age) {
this.name = name
this.age = age
this.role = 'product manager'
this.work = ['订会议室', '写PRD', '催更']
}
...
为了进一步封装构造函数的变与不变,可以创建一个角色工厂
javascript
function User(name, age, role, work) {
this.name = name
this.age = age
this.role = role
this.work = work
}
function Factory(name, age, role) {
let work
switch(role) {
case 'coder':
work = ['写代码','写系分', '修Bug']
break
case 'product manager':
work = ['订会议室', '写PRD', '催更']
break
case 'boss':
work = ['喝茶', '看报', '见客户']
case 'xxx':
// 其它工种的职责分配
...
return new User(name, age, role, work)
}
这就是对创建对象的过程的封装
抽象工厂
抽象工厂(抽象类,它不能被用于生成具体实例): 用于声明最终目标产品的共性
具体工厂(用于生成产品族里的一个具体的产品): 继承自抽象工厂、实现了抽象工厂里声明的那些方法,用于创建具体的产品的类