Skip to content

读书笔记-工厂模式

Posted on:November 30, 2023 at 10:50 AM

本读书笔记源自掘金小册 《JavaScript 设计模式核心原理与应用实践》 @修言 的一些记录及思考

简单工厂

区分 “变” 与 “不变”

构造器模式

举个栗子


// ES6的类本质也是函数的语法糖
class User {
  constructor(name, age, career, work) {
    this.name = name;
    this.age = age;
    this.career = career;
    this.work = work;
  }
}

const lilei = new User("lilei", 25, 'coder')

工厂模式的目的 - 为了实现无脑传参

举个例子

class UserWorkFactory{
  create(name, age, career) {
    switch (career) {
      case 'coder':
        return new User(name, age, career, ['写代码', '写系分', '修Bug']);
      case 'product manager':
        return new User(name, age, career, ['订会议室', '写PRD', '催更']);
      case 'boss':
        return new User(name, age, career, ['喝茶', '看报', '见客户']);
      case 'xxx':
        return new User(name, age, career, ['随便']);
      default:
        throw new Error('未知职业');
    }
  }
}

const userFactory = new UserWorkFactory();
const user1 = userFactory.create('小明', 25, 'coder');
const user2 = userFactory.create('小红', 24, 'product manager');
const user3 = userFactory.create('小王', 26, 'boss');
const user4 = userFactory.create('小李', 26, 'xxx');

工厂模式总结


抽象工厂

应遵循开放封闭原则

对扩展开放,对修改封闭。
即软件实体(类、模块、函数)可以拓展,但是不可修改。

抽象工厂不干活,具体工厂(ConcreteFactory)来干活

抽象产品(AbstractProduct)类的实现栗子

// 定义操作系统这类产品的抽象产品类
class OS {
    controlHardWare() {
        throw new Error('抽象产品方法不允许直接调用,你需要将我重写!');
    }
}

// 定义具体操作系统的具体产品类
class AndroidOS extends OS {
    controlHardWare() {
        console.log('我会用安卓的方式去操作硬件')
    }
}

class AppleOS extends OS {
    controlHardWare() {
        console.log('我会用🍎的方式去操作硬件')
    }
}
// 定义手机硬件这类产品的抽象产品类
class HardWare {
    // 手机硬件的共性方法,这里提取了“根据命令运转”这个共性
    operateByOrder() {
        throw new Error('抽象产品方法不允许直接调用,你需要将我重写!');
    }
}

// 定义具体硬件的具体产品类
class QualcommHardWare extends HardWare {
    operateByOrder() {
        console.log('我会用高通的方式去运转')
    }
}

class MiWare extends HardWare {
    operateByOrder() {
        console.log('我会用小米的方式去运转')
    }
}
// 抽象工厂
class MobilePhoneFactory{
  createOS(){
    throw new Error('抽象产品方法不允许直接调用,你需要将我重写!');
  }
  createHardWare(){
    throw new Error('抽象产品方法不允许直接调用,你需要将我重写!');
  }
}

// 具体工厂
class HaHaMobileFactory extend MobilePhoneFactory{
  con
  createOS(){
    new AndroidOS()
  }
  createHardWare(){
    new MiWare()
  }
}


// 实现
const hahaPhone = new HaHaMobileFactory()
const hahaOS = hahaPhone.createOS()
const hahaHardWare = hahaPhone.createHardWare()