本读书笔记源自掘金小册 《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()