有哪些开发者模式?

1、单例开发模式(Singleton Pattern)

单例模式是一种创建型设计模式,目的是确保在程序运行期间,某个类只有一个实例,并提供一个全局访问点来访问该实例。


核心特点

  1. 唯一实例:一个类只能创建一个对象实例。
  2. 全局访问:通过一个静态方法或变量来访问该实例。
  3. 延迟初始化:实例通常在第一次使用时才会被创建(懒加载)。
class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;}showMessage() {console.log("This is a singleton!");}
}const instance1 = new Singleton();
const instance2 = new Singleton();console.log(instance1 === instance2); // true

2、工厂模式(Factory Pattern)

特点
  • 通过一个工厂方法创建对象,而不是直接使用 new 操作符。
  • 子类可以通过工厂方法决定实例化的具体类。
适用场景
  • 创建复杂对象时,希望隐藏其创建细节。
  • 需要在运行时动态确定创建哪种对象。
class Product {constructor(name) {this.name = name;}
}class ProductFactory {static createProduct(type) {if (type === "A") {return new Product("Product A");} else if (type === "B") {return new Product("Product B");} else {throw new Error("Unknown product type");}}
}const productA = ProductFactory.createProduct("A");
console.log(productA.name); // Product A

3、观察者模式(Observer Pattern)

特点
  • 定义对象间的一对多依赖关系。
  • 当一个对象的状态改变时,所有依赖者都会收到通知并更新。
适用场景
  • 事件驱动的系统,例如 UI 事件监听。
  • 多个模块需要同步某个数据的变化。
class Subject {constructor() {this.observers = [];}addObserver(observer) {this.observers.push(observer);}notifyObservers(data) {this.observers.forEach((observer) => observer.update(data));}
}class Observer {update(data) {console.log("Observer received:", data);}
}const subject = new Subject();
const observer1 = new Observer();
const observer2 = new Observer();subject.addObserver(observer1);
subject.addObserver(observer2);subject.notifyObservers("Hello Observers!"); // All observers will log the message

4、策略模式(Strategy Pattern)

特点
  • 定义一系列算法,将它们封装成独立的策略类,并使它们可以互换
  • 避免了使用大量 if-elseswitch 语句。
适用场景
  • 动态选择算法,或者让算法的行为对客户端透明。
class StrategyA {execute() {console.log("Strategy A executed");}
}class StrategyB {execute() {console.log("Strategy B executed");}
}class Context {setStrategy(strategy) {this.strategy = strategy;}executeStrategy() {this.strategy.execute();}
}const context = new Context();
context.setStrategy(new StrategyA());
context.executeStrategy(); // Strategy A executedcontext.setStrategy(new StrategyB());
context.executeStrategy(); // Strategy B executed

5、代理模式(Proxy Pattern)

特点
  • 为某个对象提供代理,以控制对该对象的访问。
  • 可以用作缓存、权限控制、延迟加载等。
适用场景
  • 需要在访问对象前后执行额外的操作。
class RealSubject {request() {console.log("RealSubject: Handling request.");}
}class Proxy {constructor(realSubject) {this.realSubject = realSubject;}request() {console.log("Proxy: Logging access.");this.realSubject.request();}
}const realSubject = new RealSubject();
const proxy = new Proxy(realSubject);
proxy.request();
// Proxy: Logging access.
// RealSubject: Handling request.

6、装饰器模式(Decorator Pattern)

特点
  • 动态地给对象添加新功能,而不影响其他对象。
适用场景
  • 需要扩展类的功能,而不需要创建子类。
class Coffee {cost() {return 5;}
}class MilkDecorator {constructor(coffee) {this.coffee = coffee;}cost() {return this.coffee.cost() + 2;}
}class SugarDecorator {constructor(coffee) {this.coffee = coffee;}cost() {return this.coffee.cost() + 1;}
}let coffee = new Coffee();
coffee = new MilkDecorator(coffee);
coffee = new SugarDecorator(coffee);console.log(coffee.cost()); // 8

7、MVC(Model-View-Controller)

特点
  • 分离数据逻辑(Model)、用户界面(View)和控制逻辑(Controller)。
  • 适合于用户交互密集的应用。
适用场景
  • Web 应用开发(如 React 中的组件模式)。

8、MVVM(Model-View-ViewModel)

特点
  • ViewModel 作为 View 和 Model 的桥梁,提供数据绑定和双向通信。
  • 在现代框架(如 Vue、Angular)中广泛应用。

9、责任链模式(Chain of Responsibility)

特点
  • 将请求沿着责任链传递,直到某个对象处理请求。
  • 解耦请求发送者与处理者。
适用场景
  • 请求的处理有多个步骤或条件,且步骤顺序可能改变。

总结

  • 创建型模式:如单例、工厂。
  • 结构型模式:如代理、装饰器。
  • 行为型模式:如策略、责任链。
  • 架构模式:如 MVC、MVVM。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/64006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何完全剔除对Eureka的依赖,报错Cannot execute request on any known server

【现象】 程序运行报错如下: com.netflix.discovery.shared.transport.TransportException报错Cannot execute request on any known server 【解决方案】 (1)在Maven工程中的pom去掉Eureka相关的引用(注释以下部分&#xff0…

vscode写python,遇到问题:ModuleNotFoundError: No module named ‘pillow‘(已解决 避坑)

1 问题: ModuleNotFoundError: No module named pillow 2 原因: 原因1:安装Pillow的pip命令所处的python版本与vscode调用的python解释器版本不同。 如: 原因2:虽然用的是pillow,但是写代码的时候只能用…

Ashy的考研游记

文章目录 摘要12.1112.2012.21 DAY1(政治/英语)政治英语 12.22 DAY2(数学/专业课)数学专业课 结束估分 摘要 在24年的12月里,Ashy完成了他的考研冲刺,顺利的结束了他本年度的考研之旅。 在十二月里&#…

AIGC实践|AI/AR助力文旅沉浸式互动体验探索

前言: 本篇文章的创作灵感来源于近期热门话题——让文物“动起来”,各大博物馆成为新进潮流打卡地。结合之前创作的AI文旅宣传片良好的流量和反馈,外加最近比较感兴趣的AR互动探索,想尝试看看自己能不能把这些零碎的内容整合起来…

tcp 的三次握手与四次挥手

问1: 请你说一下tcp的三次握手一次握手两次握手三次握手问: 为什么不四(更多)次握手? 问 2: 请说一下 tcp 的 4 次挥手一次挥手两次挥手问题:能不能等到数据传输完成再返回 ack? 三次挥手四次挥手问: 为什么要等两个最大报文存在时间? bg: tcp 是可靠的连接,如何保证 建立连…

Kubernetes(k8s)离线部署DolphinScheduler3.2.2

1.环境准备 1.1 集群规划 本次安装环境为:3台k8s现有的postgreSql数据库zookeeper服务 1.2 下载及介绍 DolphinScheduler-3.2.2官网:https://dolphinscheduler.apache.org/zh-cn/docs/3.2.2 官网安装文档:https://dolphinscheduler.apach…

C++的侵入式链表

非侵入式链表 非侵入式链表是一种链表数据结构,其中每个元素(节点)并不需要自己包含指向前后节点的指针。链表的结构和节点的存储是分开的,链表容器会单独管理这些指针。 常见的非侵入式链表节点可以由以下所示,即&a…

Flutter组合动画学习

如何使用动画控制器和动画来创建一个简单的动画效果。具体来说,它通过一个 AnimationController 来控制两个动画,一个用于旋转,一个用于绘制。 前置知识点学习 SingleTickerProviderStateMixin SingleTickerProviderStateMixin 是 Flutter …

在vscode的ESP-IDF中使用自定义组件

以hello-world为例,演示步骤和注意事项 1、新建ESP-IDF项目 选择模板 从hello-world模板创建 2、打开项目 3、编译结果没错 正在执行任务: /home/azhu/.espressif/python_env/idf5.1_py3.10_env/bin/python /home/azhu/esp/v5.1/esp-idf/tools/idf_size.py /home…

2025差旅平台怎么选?一体化、全流程降本案例解析

差旅支出在企业中一直是一项重要但容易被忽视的成本开支,尤其是在项目驱动型企业中,因频繁的差旅需求,支出规模往往持续增长。以差旅平台分贝通签约伙伴——某智能制造业的业务模式为例,该模式要求员工定期前往不同的工厂、供应商…

【linux】NFS实验

NFS NFS服务 nfs,最早是Sun这家公司所发展出来的,它最大的功能就是可以透过网络,让不同的机器,不同的操作系统,进行实现文档的共享。所以你可以简单的将他看做是文件服务器。 实验准备 ①先准备一个服务器端的操作系统和客户端的操作系统(Red Hat)。 ②选择NAT模式,…

智源研究院与安谋科技达成战略合作,共建开源AI“芯”生态

12月25日,智源研究院与安谋科技(中国)有限公司(以下简称“安谋科技”)与正式签署战略合作协议,双方将面向多元AI芯片领域开展算子库优化与适配、编译器与工具链支持、生态系统建设与推广等一系列深入合作&a…

ROG NUC:强大内核激发创意,AI赋能学子科技探索

有这么一款能够激发无限创意、助力科技探索的迷你主机,它以其卓越的性能和迷你的身材成为了成为了ProArt百校行活动中的明星产品,助力广大学子勇敢探索未知,追逐属于自己的科技梦想。它就是ROG NUC 2024! 强大性能,创意…

从零玩转CanMV-K230(8)-多线程例程

文章目录 前言一、_thread模块API二、使用示例创建并启动线程停止线程_thread.exit() 总结 前言 K230上不支持threading,只能支持_thread,该模块实现了相应 CPython 模块的子集,CPython 是 Python 编程的参考实现 语言,也是最著名…

yii2 手动添加 phpoffice\phpexcel

1.下载地址:https://github.com/PHPOffice/PHPExcel 2.解压并修改文件名为phpexcel 在yii项目的vendor目录下创建一个文件夹命名为phpoffice 把phpexcel目录放到phpoffic文件夹下 查看vendor\phpoffice\phpexcel目录下会看到这些文件 3.到vendor\composer目录下…

安卓多渠道apk配置不同签名

一般签名都是放在buildTypes里面: ... android {...defaultConfig {...}signingConfigs {release {storeFile file("myreleasekey.keystore")storePassword "password"keyAlias "MyReleaseKey"keyPassword "password"}}bu…

数据库-用户管理

一、创建用户 create user xy104192..168.42.24 identified by 123456;xy104:用户名 localhost;这个权限最高的root用户 %:任务ip地址 192.168.42.24:登录的IP地址 identified by ‘123456’:指定该用户的密码 mysql…

管理者需要的技能

管理者需要具备技术技能、人际技能和概念技能,这三种技能的内涵如下: 技术技能 专业知识与技术能力:指管理者掌握和运用某一专业领域内的知识、技术和方法的能力。这包括对特定行业的专业知识、技术流程、工具设备的熟悉和精通。例如&#x…

scala基础学习(数据类型)-字符串

文章目录 scala中的字符串引号单引号双引号三引号 常用内置函数length 获取字符串长度charAt 字符串元素访问substring 获取字串indexOf 获取字串位置replace 字符串替换toLowerCase,toUpperCase 字符串大小写转换trim 去除首位空白符split 字符串切割以及查看startsWith,endsW…

数据库安全-redisCouchdb

1.redis未授权访问 默认端口:6379 1.1 Redis沙盒逃逸漏洞RCE-CVE-2022-0543 介绍:Redis 是一套开源的使用 ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值存储数据库,并提供多种语言的API。Redis 如果在没有开启认证的情况下,…