设计模式---工厂模式

2019-07-12  本文已影响0人  noyanse

根据不同的输入返回不同类的实例 主要思想是对象的创建和实现分离

应用:

  1. 对象的创建比较复杂,访问者无需知道创建的具体流程
  2. 处理大量具有相同属性的小对象
  3. 注意不要滥用

优点:

  1. 封装良好
  2. 扩展性好
  3. 解耦了高层逻辑层与底层产品类

缺点:

增加了系统复杂度

/**
 * 设计模式-工厂函数 
 */
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)
}

抽象工厂模式

主要关注产品类簇实例的创建,如果产品类簇只有一个产品,那么抽象工厂模式就退化为工厂模式了。

  1. Factory:工厂,负责返回产品实例
  2. AbstractFactory: 虚拟工厂,指定工厂实例的结构
  3. Product: 产品, 访问者从工厂中拿到的产品实例,实现抽闲类
  4. 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()
上一篇下一篇

猜你喜欢

热点阅读