美文网首页
设计模式---工厂模式

设计模式---工厂模式

作者: noyanse | 来源:发表于2019-07-12 18:25 被阅读0次

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

    应用:

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

    相关文章

      网友评论

          本文标题:设计模式---工厂模式

          本文链接:https://www.haomeiwen.com/subject/apbykctx.html