首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js的几种设计模式

JavaScript 中常见的设计模式有以下几种:

1. 单例模式

  • 概念:确保一个类只有一个实例,并提供一个全局访问点来获取该实例。
  • 优势:节省系统资源,避免重复创建对象。
  • 应用场景:例如全局配置对象、日志记录器。
  • 示例代码:
代码语言:txt
复制
const Singleton = (function () {
    let instance;
    function createInstance() {
        const object = new Object("I am the instance");
        return object;
    }
    return {
        getInstance: function () {
            if (!instance) {
                instance = createInstance();
            }
            return instance;
        }
    };
})();

2. 工厂模式

  • 概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
  • 优势:增加代码的灵活性和可扩展性。
  • 应用场景:根据不同的条件创建不同类型的对象。
  • 示例代码:
代码语言:txt
复制
function Car(make, model, year) {
    this.make = make;
    this.model = model;
    this.year = year;
}

function Truck(make, model, year) {
    this.make = make;
    this.model = model;
    this.year = year;
}

function VehicleFactory() {}

VehicleFactory.prototype.vehicleClass = Car;

VehicleFactory.prototype.createVehicle = function (make, model, year) {
    if (this.vehicleClass) {
        return new this.vehicleClass(make, model, year);
    } else {
        throw new Error('Invalid vehicle class');
    }
};

3. 观察者模式

  • 概念:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并自动更新。
  • 优势:实现对象间的松耦合,当一个对象状态改变时自动通知其他依赖对象。
  • 应用场景:事件监听和处理、实时数据更新。
  • 示例代码:
代码语言:txt
复制
class Subject {
    constructor() {
        this.observers = [];
    }

    addObserver(observer) {
        this.observers.push(observer);
    }

    removeObserver(observer) {
        const index = this.observers.indexOf(observer);
        if (index!== -1) {
            this.observers.splice(index, 1);
        }
    }

    notify(data) {
        this.observers.forEach(observer => observer.update(data));
    }
}

class Observer {
    update(data) {
        console.log('Received data:', data);
    }
}

4. 模块模式

  • 概念:通过闭包来封装私有变量和方法,只暴露必要的接口。
  • 优势:保护内部数据,避免全局污染。
  • 应用场景:创建具有私有属性和方法的对象。
  • 示例代码:
代码语言:txt
复制
const Module = (function () {
    let privateVar = 'I am private';

    function privateMethod() {
        console.log(privateVar);
    }

    return {
        publicMethod: function () {
            privateMethod();
        }
    };
})();

5. 代理模式

  • 概念:为其他对象提供一种代理以控制对这个对象的访问。
  • 优势:可以在访问对象时进行一些额外的操作,如权限控制、缓存等。
  • 应用场景:延迟加载、访问控制。
  • 示例代码:
代码语言:txt
复制
class Image {
    constructor(url) {
        this.url = url;
        this.loadImage();
    }

    loadImage() {
        console.log(`Loading image from ${this.url}`);
    }
}

class ImageProxy {
    constructor(url) {
        this.url = url;
        this.image = null;
    }

    showImage() {
        if (!this.image) {
            this.image = new Image(this.url);
        }
        this.image.loadImage();
    }
}

这些设计模式在不同的场景中可以帮助开发者更有效地组织和管理代码,提高代码的可维护性和可扩展性。但过度使用或不恰当使用也可能导致代码复杂性增加。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JS常用的几种设计模式

面试常常问到设计模式,设计模式在实际业务中即使有用到,但是依然感受不到它的存在,往往在框架中会有更多体现,比如vue2源码,内部还是有很多设计思想,比如观察者模式,模版模式等,我们在业务上一些通用的工具类也会用到单例...好记性不如烂笔头,又重新回顾了一遍设计模式,虽然仅仅掌握了几种熟悉的设计模式,但是希望在复杂的业务上,能想起那些不太常用的设计模式。 正文开始......【发布订阅模式】 是一种行为模式,主要用于不同对象之间的交互信息 发布对象:重要事情发生时,会通知订阅者 订阅对象:监听发布对象的通知,并做出相应的反应 观察者主要分为两类:推送模式和拉动模式 推送模式是由发布者负责将消息发送给订阅者...》中也有很多其他模式,比如代理模式,中介者模式,状态模式等,很多的设计模式实际上在业务代码里并不会用到,在某些特殊业务场景这些设计模式的思想会大大增强我们代码的拓展性,但过度的设计模式也会带来一定的阅读负担...总结 常用的设计模式,比如说单例模式,单例就是只对外暴露一个实例,所有的内部方法都是通过这个实例访问 策略者模式是一种多条件的优化模式,当你在条件判断很多时,可以考虑策略者模式 工厂模式,主要通过一个中间函数

78320

浅谈几种设计模式

设计模式分类 总体来说设计模式分为三大类: 创建型模式: 单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。...行为型模式: 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 设计模式思维导图 ? ? 单例模式 ?...又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。...将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作,说白了就是为了挂羊头卖狗肉而专门设计的模式。也就是把一个类的接口变换成客户端所期待的另一种接口。...推荐阅读: 易懂版设计模式--门面模式 设计模式---命令模式 如何搞定Mybatis 中的 9 种设计模式 一篇搞定---装饰器模式 设计模式-Spring

55740
  • 浅谈几种设计模式--代理模式

    代理 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。...如何解决静态代理中的缺点呢? 答案是可以使用动态代理方式 spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。 ?...这种操作,也是使用代理模式的一个很大的优点。最直白的就是在Spring中的面向切面编程(AOP),我们能在一个切点之前执行一些操作,在一个切点之后执行一些操作,这个切点就是一个个方法。...,其实就是AOP的一个简单实现了,在目标对象的方法执行之前和执行之后进行了处理,对方法耗时统计。...Spring的AOP实现其实也是用了Proxy和InvocationHandler这两个东西的。

    68620

    微服务的几种设计模式

    ,所以具有高内聚、低耦合的特性 每个微服务可以用不同语言编写,然后不同服务之间用同一的方式通信,如gRPC 缺点: 设计复杂,微服务通常适用于较大型的系统,且解决方案众多,所以用对合适的方案很重要 分布式系统复杂性...安全性,同时保障多个服务之间的安全性具有一定挑战 数据共享的数据一致性的保障困难 何时使用微服务 网络规模的应用程序开发 多个团队处理应用程序时的企业应用程序开发 长期收益优于短期收益 团队拥有能够设计微服务架构的软件架构师或高级工程师...4.微服务的设计模式 1.独享数据库 单体服务的时候一般是用一个大型中央数据库,但是到了微服务则不能所有服务都使用一个数据库,特别是在大规模系统中,这将导致微服务在数据库层严重耦合 更好的方法是为每个微服务提供自己的数据存储...、性能、能耗和网络带宽,它们的 API 需求不同 BFF是 API 网关模式的一种变体,它提供了基于客户端的多个网关,而不是提供给客户端一个单一的入口点,目的是根据客户端的需求提供量身定制的 API,从而消除了为所有客户端制作通用...然而,如果出现了严重问题(微服务完全失败),那么微服务将长时间不可用,这时重试没有意义且浪费宝贵的资源(线程被阻塞,CPU 周期被浪费) 在这种情况,可以使用断路器模式挽救,通过统计最近发生的故障数量,

    90711

    浅谈几种设计模式--模板模式

    概述 模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 类结构图 ?...就拿建网站来说,一般的程序是购买域名-->购买空间-->上传网站-->备案-->审核,每个网站的创建必须经过这样的固定程序,但除了审核不用建站者关心,其他的步骤都要建站者自己去完成。...制作豆浆的程序简单点来说就是 选材--->添加配料--->浸泡--->放到豆浆机打碎,通过添加不同的配料,可以制作出不同口味的豆浆,但是选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的...钩子方法 在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。我们还是用上面做豆浆的例子来讲解。...(3)、既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。 (4)、提供了一个基本框架,容易扩展子类。

    39920

    面向对象的几种设计模式

    ----例子有点不恰当,面向对象的概念本身十分的抽象,只能慢慢体会 2 面向对象的设计模式 一.普通模式    普通模式比较繁琐,一个对象一个实例,        普通创建对象的方法,缺陷: 如果创建多个对象会比较繁琐...Prototype模式的验证方法 isPrototypeOf()这个方法用来判断,某个proptotype对象和某个实例之间的关系。...函数共享不会造成问题,但对象却很少被多个实例共享,如果共享的是对象就会造成问题 五 混合模式(构造函数模式+原型模式) //构造函数模式可以传递参数,而且使用this关键字,活动性很强,但消耗内存过多...//原型模式消耗内存小,但活动性很差,因此两者合并,当需要传递参数时,则使用构造函数,当需要执行方法时,使用原型模式, 这是目前最为常用的创建对象的方式。...此外,组合模式还支持向构造函数传递参数,可谓是集两家之所长。 在所接触的JS库中,jQuery类型的封装就是使用组合模式来实例的!!!

    95840

    浅析几种设计模式--策略模式

    策略模式是对算法的包装,把使用算法的责任和算法本身分隔开,委派给不同的对象管理。策略模式通常把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。...作用 将算法的责任和本身进行解耦,使得: 1.算法可独立于使用外部而变化 2.客户端方便根据外部条件选择不同策略来解决不同问题 策略模式仅仅封装算法(包括添加 & 删除),但策略模式并不决定在何时使用何种算法...//生成销售员实例时告诉销售员什么节日(构造方法) //使得让销售员根据传入的参数(节日)选择促销活动(这里使用一个简单的工厂模式) public SalesMan(String...易于扩展 增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合“开闭原则“ 避免使用多重条件选择语句(if else),充分体现面向对象设计思想。...策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。 策略模式的本质:少用继承,多用组合

    42920

    JavaScript中几种常用的设计模式

    大家好,又见面了,我是你们的朋友全栈君。 设计模式:代码书写经验,为了应对各种场景,经过前人不断的总结,压缩,形成的一套又一套的代码的书写规范,形成了设计模式。...1.单例模式 单例模式是一种常用的设计模式,如果需要多次创建同一个对象,完成同一件事情,就会多次new出来很多个对象,而单例模式确保只有一个实例,并提供全局访问。...(唯一的),每次获取的都是一个东西,所以他 两相等 console.log(p1 === p2); 2.组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。...将多个对象的功能,组成起来,实现批量执行。使用这种模式可以用一条命令在多个对象上激发复杂的递归的行为。...,执行组合器的启动功能 c.action(); // 在内部,会自动执行所有已经组合起来的对象的功能 3.观察者模式 也称发布-订阅模式,定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时

    33810

    几种常用设计模式的简单示例

    [23-09-33-mihmnv.jpeg] 前言 模式是在某一背景下某个问题的一种解决方案。...设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。...为了保证代码的可靠性、提高代码的复用率、使代码更容易被维护和阅读,我们需要了解并合理使用设计模式。...日常开发中,一些特定的场景下你的处理方法可能并不是很理想,往往这时借助一些设计模式可以让你优雅而高效的实现这些逻辑,下面就介绍一些虽然不是最全的但一定是最常用的设计模式。...: Javascript 观察者模式 //用户2订阅了: Javascript 发布-订阅模式 总结 学习设计模式不仅可以使我们用好这些成功的设计模式,更重要的是可以使我们深入理解面向对象的设计思想。

    57910

    浅谈几种设计模式--观察者模式

    1 定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。...3 观察者模式具体实现: (1)、定义一个抽象被观察者接口 /*** * 抽象被观察者接口 * 声明了添加、删除、通知观察者方法 */ public interface Observerable...*/ public class WechatServer implements Observerable { //注意到这个List集合的泛型参数为Observer接口,设计原则:...小结: 这个模式是松偶合的。改变主题或观察者中的一方,另一方不会受到影像。JDK中也有自带的观察者模式。但是被观察者是一个类而不是接口,限制了它的复用能力。...在JavaBean和Swing中也可以看到观察者模式的影子。

    40130

    JS设计模式 - 笔记

    设计模式概略 + 常用设计模式 包括单例模式、策略模式、代理模式、发布订阅模式、命令模式、组合模式、装饰器模式、适配器模式 # 设计模式概略 ---- # 什么是设计模式 定义:在软件设计过程中...,针对特定问题的简洁而优雅的解决方案 # SOLID 五大设计原则 Single:单一职责原则 一个程序只做好一件事 Open:开放封闭原则 对扩展开放,对修改封闭 Liskov:里氏置换原则 子类能覆盖父类...,并能出现在父类出现的地方 Interface:接口独立原则 保持接口的单一独立 Dependency:依赖导致原则 使用方法只关注接口而不关注具体类的实现 # 为什么需要设计模式 易读性 使用设计模式能够提升代码的可读性...,提升后续开发效率 可扩展性 使用设计模式对代码解耦,能很好地增强代码的易修改性和扩展性 复用性 使用设计模式可以重用已有的解决方案,无需再重复相同工作 可靠性 使用设计模式能够增加系统的健壮性,...使代码编写真正工程化 # 常见设计模式 ---- # 单例模式 定义:唯一 & 全局访问。

    85530

    前端开发中常用的几种设计模式有哪些_设计模式原理

    大家好,又见面了,我是你们的朋友全栈君。 设计模式概览 设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。...设计模式更多的是指导思想和方法论,而不是现成的代码,当然每种设计模式都有每种语言中的具体实现方式。...学习设计模式更多的是理解各种模式的内在思想和解决的问题,毕竟这是前人无数经验总结成的最佳实践,而代码实现则是对加深理解的辅助。...设计模式可以分为三大类: 结构型模式(Structural Patterns): 通过识别系统中组件间的简单关系来简化系统的设计。...上述中一共有23种设计模式,但我们作为前端开发人员,需要了解的大概有以下10种。 前端需要了解的设计模式(10种) 创建型模式 故名思意,这些模式都是用来创建实例对象的。 1.

    1.8K30

    JS设计模式之代理模式

    https://blog.csdn.net/j_bleach/article/details/71374535 什么是代理模式 代理模式,类似于明星的经纪人,想要拜访明星...而在JS当中,如果想访问一个类,需要通过另一个类来间接访问 。不同于装饰器,那种动态加载一个对象,可以说在代理模式当中,代理是早已既定的。 别人眼中的代理 ?...而后者在代码上还多了一些,但为什么这里还是推荐使用后面这种模式来写代码呢? 使用代理模式的好处 首先介绍一个面向对象设计原则,单一职责原则。 又称单一功能原则,面向对象五个基本原则(SOLID)之一。...软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。...其他的设计原则,很多时候是为实现这一目标服务的,例如以Liskov替换原则实现最佳的、正确的继承层次,就能保证不会违反开放封闭原则。

    77141

    设计模式之命令模式-JS

    命令模式的用途 命令模式是最简单和优雅的模式之一,命令模式中的命令(command)指的是一个执行某些特定事情的指令。   ...此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系。  ...回想一下命令模式的应用场景:    有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么,此时希望用一种松耦合的方式来设计软件,使得请求发送者和请求接收者能够消除彼此之间的耦合关系...此时我们需要借助命令对象的帮助,以便解开按钮和负责具体行为对象之间的耦合。    设计模式的主题总是把不变的事物和变化的事物分离开来,命令模式也不例外。...命令模式的由来,其实是回调(callback)函数的一个面向对象的替代品   在面向对象设计中,命令模式的接收者被当成command对象的属性保存起来,同时约定执行命令的操作调用command.execute

    1.1K20

    JS设计模式之工厂模式

    ——《设计模式:可复用面向对象软件的基础》中文版第81页 在我理解中,所谓工厂方法,是指我们通过调用已知的接口,获得未知的对象,做出预期的行为。工厂方法为我们提供这一对象。...——《设计模式:可复用面向对象软件的基础》 说人话,就是工厂方法只有一个方法,抽象工厂有多个方法。...许多文章喜欢以不同的操作系统匹配不同的外观举例,但是我们既然都用上了跑在浏览器里的JS,那就尽可能不考虑跨平台的问题。 所以我想到了移动端和桌面端UI不同,这或许是一个应用抽象工厂模式的良好切入点。...如果按照《设计模式:可复用面向对象软件的基础》中的定义来说,它是不正确的。但我们不探讨者是否正确,我们也来实现一个可拓展的工厂。...总结 下面来自于 Learning JavaScript Design Patterns,我手动翻译过来的。 什么时候需要使用 工厂模式在下列几种情况是很有用的: 当创建对象或初始化的过程很复杂时。

    99620

    设计模式【1】-- 单例模式到底几种写法?

    饿汉模式 1.私有属性 2.公有属性 3. 懒加载 懒汉模式 1.原子操作 2.指令重排 枚举实现单例 单例模式,是一种比较简单的设计模式,也是属于创建型模式(提供一种创建对象的模式或者方式)。...2.单例模式不一定是线程不安全的。...3.单例模式可以分为两种:懒汉模式(在第一次使用类的时候才创建,可以理解为类加载的时候特别懒,要用的时候才去获取,要是没有就创建,由于是单例,所以只有第一次使用的时候没有,创建后就可以一直用同一个对象)...在单例模式中一般是调用getInstance()方法来触发类装载,以上的两种饿汉模式显然没有实现lazyload(个人理解是用的时候才触发类加载) 所以下面有一种饿汉模式的改进版,利用内部类实现懒加载。...,饿汉方式也是不错的,其中懒汉模式下,如果涉及多线程的问题,也需要注意写法。

    23430
    领券