Skip to content

工厂模式

构造器模式

抽象每个对象实例的变与不变

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)
}

这就是对创建对象的过程的封装

抽象工厂

抽象工厂(抽象类,它不能被用于生成具体实例): 用于声明最终目标产品的共性

具体工厂(用于生成产品族里的一个具体的产品): 继承自抽象工厂、实现了抽象工厂里声明的那些方法,用于创建具体的产品的类