• 设计模式 — — 工厂模式


    问题

    在一个 A 类中通过 new 的方式实例化了类 B,那么 A 类和 B 类之间就存在关联(耦合)

    就需要将创建实例的工作从调用方(A类)中分离,与调用方解耦,也就是使用工厂方法创建实例的工作封装起来(减少代码重复)

    使用工厂最终达到的效果是:多态,和类与类之间的松耦合

    工厂模式分类

    工厂模式根据抽象程度的不同可以分为:

    • 简单工厂模式(Simple Factory)
    • 工厂方法模式(Factory Method)
    • 抽象工厂模式(Abstract Factory)
    简单工厂模式
    function Factory(career) {
        function User(career, work) {
            this.career = career 
            this.work = work
        }
        let work
        switch(career) {
            case 'coder':
                work =  ['写代码', '修Bug'] 
                return new User(career, work)
                break
            case 'hr':
                work = ['招聘', '员工信息管理']
                return new User(career, work)
                break
            case 'driver':
                work = ['开车']
                return new User(career, work)
                break
            case 'boss':
                work = ['喝茶', '开会', '审批文件']
                return new User(career, work)
                break
        }
    }
    let coder = new Factory('coder')
    console.log(coder)
    let boss = new Factory('boss')
    console.log(boss)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    工厂方法模式

    把具体的产品放到了工厂函数的prototype中

    // 工厂方法
    function Factory(career) {
        if (this instanceof Factory) {
            var a = new this[career]();
            return a;
        } else {
            return new Factory(career);
        }
    }
    // 工厂方法函数的原型中设置所有对象的构造函数
    Factory.prototype = {
        'coder': function () {
            this.careerName = '程序员'
            this.work = ['写代码', '修Bug']
        },
        'hr': function () {
            this.careerName = 'HR'
            this.work = ['招聘', '员工信息管理']
        },
        'driver': function () {
            this.careerName = '司机'
            this.work = ['开车']
        },
        'boss': function () {
            this.careerName = '老板'
            this.work = ['喝茶', '开会', '审批文件']
        }
    }
    let coder = new Factory('coder')
    console.log(coder)
    let hr = new Factory('hr')
    console.log(hr)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    常见应用

    • jQuery 的 $ 对象
    • React.createElement()
    • Vue.component()
  • 相关阅读:
    【每日OJ —— 232.用栈实现队列(栈)】
    Understanding the Users and Videos by Mining a Novel Danmu Dataset
    [附源码]计算机毕业设计打印助手平台
    ava异常处理面试题及答案
    快速排序-排序-数据结构和算法
    axios发post请求,后端接收不到参数的原因及解决
    进阶 | 数据科学家提高效率的 40 个 Python 技巧
    FineReport智能数据图表- 文本域控件
    OpenCV图像处理——直方图
    SpringCloud学习笔记(eureka注册中心)
  • 原文地址:https://blog.csdn.net/weixin_43924228/article/details/136673050