设计模式 — — 工厂模式

问题

在一个 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)
工厂方法模式

把具体的产品放到了工厂函数的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)

常见应用

  • jQuery 的 $ 对象
  • React.createElement()
  • Vue.component()

相关推荐

  1. 设计模式工厂模式

    2024-03-14 11:18:02       69 阅读
  2. 设计模式--工厂模式

    2024-03-14 11:18:02       53 阅读
  3. 设计模式 工厂模式

    2024-03-14 11:18:02       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-14 11:18:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-14 11:18:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-14 11:18:02       87 阅读
  4. Python语言-面向对象

    2024-03-14 11:18:02       96 阅读

热门阅读

  1. - 概述 - 《设计模式(极简c++版)》

    2024-03-14 11:18:02       36 阅读
  2. c++qt函数中如何返回一个类对象或对象的引用

    2024-03-14 11:18:02       49 阅读
  3. Nginx和Ribbon实现负载均衡的区别

    2024-03-14 11:18:02       43 阅读
  4. 【OJ】K 个一组翻转链表

    2024-03-14 11:18:02       45 阅读
  5. Stream流

    Stream流

    2024-03-14 11:18:02      35 阅读
  6. Spring Boot 自动配置原理

    2024-03-14 11:18:02       38 阅读
  7. MATLAB使用OMP实现图像的压缩感知实例

    2024-03-14 11:18:02       39 阅读
  8. BACnet device对象详解以及协议栈相关代码

    2024-03-14 11:18:02       28 阅读