根据不同的输入返回不同类的实例 主要思想是对象的创建和实现分离
应用:
- 对象的创建比较复杂,访问者无需知道创建的具体流程
- 处理大量具有相同属性的小对象
- 注意不要滥用
优点:
- 封装良好
- 扩展性好
- 解耦了高层逻辑层与底层产品类
缺点:
增加了系统复杂度
/**
* 设计模式-工厂函数
*/
class Restaurant {
static getMenu(menu) {
switch (menu) {
case '鱼香肉丝':
return new YuXiangRouSi()
case '宫保鸡丁':
return new GongBaoJiDin()
default:
throw new Error('本店没有')
}
}
}
class YuXiangRouSi {
constructor () {
this.type = '鱼香肉丝'
}
eat() {
console.log(this.type + '好吃~')
}
}
class GongBaoJiDin {
constructor () {
this.type = '宫保鸡丁'
}
eat() {
console.log(this.type + '好吃~')
}
}
const dish1 = Restaurant.getMenu('鱼香肉丝')
const dish2 = Restaurant.getMenu('宫保鸡丁')
/**
* @description Vue 源码中的工厂模式 虚拟DOM树机制 createElement生成VNode 用来映射真是DOM节点
*/
createElement('h3', { class: 'main-title' }, [
createElement('img', { class: 'avatar', attrs: { src: './avatar.png' } }),
createElement('p', { class: 'user-desc' }, '我要的飞翔,不是谁的肩膀')
])
// createElement:
class Vnode(tag, data. children) {
// ...
}
function createElement(tag, data, children) {
return new Vnode(tag, data, children)
}
抽象工厂模式
主要关注产品类簇实例的创建,如果产品类簇只有一个产品,那么抽象工厂模式就退化为工厂模式了。
- Factory:工厂,负责返回产品实例
- AbstractFactory: 虚拟工厂,指定工厂实例的结构
- Product: 产品, 访问者从工厂中拿到的产品实例,实现抽闲类
- AbstractProduct: 产品抽象类,由具体产品实现,指定产品实例的结构
/**
* @description 抽象工厂模式
*/
// 饭店方法
class Restaurant {
static orderDish(type) {
switch (type) {
case '鱼香肉丝':
return new YuXiangRouSi()
case '宫保鸡丁':
return new GongBaoJiDin()
default:
throw new Error('本店没有~')
}
}
}
// 菜品抽象类
class Dish { // 父类
constructor() {
if (new.target === Dish) {
throw new Error('抽象类不能直接实例化')
}
this.kind = '菜'
}
// 抽象方法 相当于定义一个接口,由子类继承
eat() {
throw new Error('抽象方法不能被调用')
}
}
// 菜品 继承菜品抽象类
class YuXiangRouSi extends Dish {
constructor() {
super()
this.type = '鱼香肉丝'
}
eat() {
console.log(this.kind, this.type, '鱼香肉丝')
}
}
class GongBaoJiDin extends Dish {
constructor() {
super()
this.type = '宫保鸡丁'
}
eat() {
console.log(this.kind, this.type, '宫保鸡丁')
}
}
const dish0 = new Dish() // Error 抽象类不能直接实例化
const dish1 = Restaurant.orderDish('鱼香肉丝')
dish1.eat()
网友评论