前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript 中的设计模式:创建模式

JavaScript 中的设计模式:创建模式

作者头像
海拥
发布于 2023-02-27 00:44:53
发布于 2023-02-27 00:44:53
55300
代码可运行
举报
文章被收录于专栏:全栈技术全栈技术
运行总次数:0
代码可运行

在日常生活中,程序员在写代码的时候可能会遇到很多错误,自然而然的就会想出解决这些问题的方法。不同项目中不同打印机开发的解决方案彼此非常相似。这就是设计模式发挥作用的地方。

设计模式是软件开发人员在软件开发过程中面临的常见问题的解决方案。

让我们检查项目中的设计模式以便更好地理解:

它通常基于 OOP。但是无论语言和技术如何,它都可以使用。 它们是软件开发人员使用的经过验证的解决方案方法。 它们是应用于问题的一般解决方案。 我们在 3 个标题下收集设计模式:

创意图案 结构模式 行为模式 在本文中,我将讨论创建模式:

创建模式

它是一种用于创建和管理对象的模式。它们提供提高代码灵活性和可重用性的对象创建机制。

工厂方法

它定义了一个接口来创建单个对象,并允许子类决定实例化哪个类。

示例:让我们定义一个名为 Person 的类。

代码语言:javascript
代码运行次数:0
运行
复制
class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
}

现在让我们添加工厂方法:

代码语言:javascript
代码运行次数:0
运行
复制
class PersonFactory {
    static add(name, age) {
        return new Person(name, age);
    }
}

现在我们可以使用我们的 PersonFactory 模型创建一个新的 Person 对象:

代码语言:javascript
代码运行次数:0
运行
复制
const person = PersonFactory.add("furkan", 24);
console.log(person)
> Output:
> Person { name: 'furkan', age: 24 }

抽象工厂

抽象工厂是我们想要同时处理多个对象时可以使用的一种设计模式。

示例:让我们继续 Person 示例并创建另一个从 Person 类派生的名为 Client 的类:

代码语言:javascript
代码运行次数:0
运行
复制
class Person {
    consume() {}
}
class Client extends Person {
    consume() {
        console.log("Client")
    }
}

现在让我们为它们创建工厂方法,看看 abstract 是如何使用的:

代码语言:javascript
代码运行次数:0
运行
复制
class PersonFactory {
    prepare(name)
}
class ClientFactory extends PersonFactory {
    addClient() {
        console.log("Client created")
        return new Client();
    }
}

现在是时候使用我们的抽象工厂方法了:

代码语言:javascript
代码运行次数:0
运行
复制
const clientUserFact = new ClientFactory();
const person = clientUserFact.addClient();
person.consume();
> Output:
> Client created
> Client

建设者

这种设计允许您使用相同的构造代码创建对象的不同类型和表示。

示例:让我们继续经典的 Person 示例。这里我们稍微修改一下Person对象:

代码语言:javascript
代码运行次数:0
运行
复制
class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }

    toString() {
        return (
         `${this.name} is ${this.age} years old!`    
        )
    }
}

我们在 Person 对象中使用两条信息:姓名和年龄。现在让我们定义一个 Person Builder:

代码语言:javascript
代码运行次数:0
运行
复制
class PersonBuilder {
    constructor(person = new Person()) {
        this.person = person;
    }

    get age() {
        return new PersonAgeBuilder(this.person);
    }

    get name(){
        return new PersonNameBuilder(this.person);
    }

    build() {
        return this.person;
    }
}

上面我们说了我们的对象包含两条信息。现在让我们在这里创建这些对象的构建器:

代码语言:javascript
代码运行次数:0
运行
复制
class PersonNameBuilder extends PersonBuilder {
    constructor(person) {
        super(person)
    }

    is(name) {
        this.person.name = name;
        return this;
    }
}
class PersonAgeBuilder extends PersonBuilder {
    constructor(person) {
        super(person)
    }

    is(age) {
        this.person.age = age;
        return this;
    }
}

现在是时候使用我们编写的对象了:

代码语言:javascript
代码运行次数:0
运行
复制
const personBuilder = new PersonBuilder();
const person = personBuilder
                .name.is("Furkan")
                .age.is(24)
                .build();
console.log(person.toString());

> Output:
> Furkan is 24 years old!

原型

原型是一种设计模式,它允许您复制现有对象而不使您的代码依赖于它们的类。

示例:我们再次来到我们的 Person 对象 😄 这里我们的 Person 对象将如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
class Person {
    constructor(name) {
        this.name = name;
    }

    setName(name) {
        this.name = name;
        console.log(name.toString())
    }

    clone() {
        return new Person(this.name)
    }
}

我们说过目的是复制,我们在我们的对象中放置了一个名为 clone 的方法。现在让我们使用它并克隆我们的对象:

代码语言:javascript
代码运行次数:0
运行
复制
const person1 = new Person();
person1.setName("furkan");
const person2 = person1.clone();
person2.setName("tugay");

> Output:
> furkan
> tugay

单例

单例用于确保一个对象只有一个实例,并且在您需要该对象时在您的代码中的任何地方都被相同地调用。

这也类似于SOLID原则中的“单一职责原则”。

示例:我们已经来到最后一个示例,我们将在其中使用 Person 对象。

代码语言:javascript
代码运行次数:0
运行
复制
class Person {
    constructor() {
        const instance = this.constructor.instance;
        if(instance) {
            return instance;
        }
        this.constructor.instance = this;
    }

    toString() {
        console.log("Person Class");
    }
}

我们还可以通过这种方式检查是否提供了单例:

代码语言:javascript
代码运行次数:0
运行
复制
const person1 = new Person();
const person2 = new Person();
console.log("is same: ", (person1 === person2));
person1.toString();
> Output:
> Person Class

在这篇文章中,我谈到了什么是设计模式,并试图用 JavaScript 代码解释创意模式。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
ISP Pipeline | camera成像原理
由于Sensor漏电流存在,刚把镜头放入一个全黑的环境,Sensor输出的原始数据不为0;而我们希望全黑时原始数据为0。
iResearch666
2023/12/14
1.7K0
ISP Pipeline | camera成像原理
【十天自制软渲染器】DAY 01:图形学学习建议与环境搭建
「十天自制软渲染器」这个标题我承认标题党了。在对图形学一无所知的情况下想十天自制一个软渲染器,就好似一节课没上过却试图一个晚上看完《30 天精通 C++》然后第二天早上八点考试得满分一样,我承认世界上有这种天才,但很可惜我不是。
卤代烃
2021/01/18
1.1K0
图像伽马校正_自动梯形校正
图中可以看到,sRGB和Rec.709的色域虚线一样,三原色的位置是相同的,那么它们之间的区别就是:传递函数不同
全栈程序员站长
2022/11/08
1.6K0
图像伽马校正_自动梯形校正
HDR关键技术—色域映射
HDR系列前几期为大家介绍了HDR的色调映射技术(Tone Mapping)。其中提到:在色调映射环节,为了便于操作,且不使图像颜色产生巨大失真,色调映射算法通常会仅处理图像亮度信息,将HDR图像亮度映射到SDR图像亮度域中,通过原HDR图像的颜色信息,恢复并重建SDR图像的颜色信息。由于前面的主题是色调映射,因此颜色转换相关技术,我们没有深入介绍。但颜色转换或色域映射问题(Color Transfer or Gamut Mapping),也是HDR的重要环节。本文将介绍HDR中颜色转换(或色域映射)技术,分为两个部分,第一部分介绍色域映射的定义以及相关背景知识;第二部分将介绍代表性的色域映射算法,特别对ITU中相关标准进行浅析。
用户1324186
2018/07/26
9.8K0
HDR关键技术—色域映射
QQ x FARMER BOB联名设计揭秘
01 概述 What is Farmer BOB  韩国设计师JO YOUNG WOON在大学时主攻设计,并曾留学日本两年,2016年和2017年在Tokyo Design Festa崭露头角。家乡在韩国光州,巧合下与同为设计师的女朋友一起加入ARTTOY的制作行列。WHAT THE FARMER设定中主角BOB是一名农民,不过造型和配件方面均没有传统农民的感觉。BOB之名,取自设计师喜欢的画家BOB ROSS 和雷鬼音乐人BOB MARLEY。 JO YOUNG WOON,a South Kor
腾讯ISUX
2020/09/15
1.1K0
HDR关键技术:逆色调映射(一)
HDR技术近年来发展迅猛,在未来将会成为图像与视频领域的主流。当前HDR内容非常短缺,限制了HDR视听节目的广泛应用。逆色调映射(Inverse Tone Mapping)应运而生,它是一种用来将SDR源信号转换为HDR源信号的技术,可以应用于生产端或终端设备,在一定程度上实现对现有SDR节目的HDR“还原”及向上兼容。本系列中,我们将会详细分类介绍逆色调映射算法。分为两个部分:(一)逆色调映射概述及一些经典算法,包括全局算法,分类算法以及拓展映射算法;(二)介绍最近的研究趋势,特别是基于机器学习的逆色调映射算法。Let's go for the first part!
用户1324186
2018/07/26
10.9K0
HDR关键技术:逆色调映射(一)
HDR的主要标准有哪些?
HDR ( High-Dynamic Range ) 高动态范围技术是一种在图像处理和显示领域中常用的技术,旨在提供更广泛的亮度范围和更丰富的色彩细节,通过在图像中捕捉和显示更多的亮度级别来提高图像的质量,让电影、图片、游戏画面都能呈现出极佳的效果,使用户在观影、玩游戏时感受更接近真实世界中的视觉体验。
微帧Visionular
2024/10/30
4860
HDR的主要标准有哪些?
Unity通用渲染管线(URP)系列(十二)—— HDR(Scattering and Tone Mapping)
这是有关创建自定义脚本渲染管道的系列教程的第12部分。它增加了对高动态范围渲染,基于散射的光晕和色调映射的支持。
放牛的星星
2021/01/11
4.5K0
Unity通用渲染管线(URP)系列(十二)—— HDR(Scattering and Tone Mapping)
【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】四、深入了解OpenGL之EGL
前面的文章就介绍过,OpenGL是基于线程的,直到目前为止,我们并没有深刻的认识到这个问题,但我们知道的是,当我们继承GLSurfaceView.Renderer时,系统会回调以下方法:
开发的猫
2020/04/02
2.7K0
【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】四、深入了解OpenGL之EGL
SDL2来源分析3:渲染(SDL_Renderer)
=====================================================
全栈程序员站长
2022/07/06
3.3K0
SDL2来源分析3:渲染(SDL_Renderer)
记 – PC视频播放最强画质教程(Potplayer + madVR)「建议收藏」
由于一些网站是外网,有些朋友可能打不开,因此我下载了一份2021.11.10最新版的软件
全栈程序员站长
2022/10/05
50.1K1
记 – PC视频播放最强画质教程(Potplayer + madVR)「建议收藏」
ISUX译文 | The PBR Guide基于物理的渲染指引(下)
腾讯ISUX isux.tencent.com 社交用户体验设计 近日在研究3D-TO-H5工作流及学习PBR的过程中,发现Substance官方新版的《The PBR Guide》尚未有完整的中文翻译,所以把心一横,斗胆翻译了一波,希望能抛砖引玉,让大家更深入浅出地了解3D材质贴图及PBR技术。 PBR,Physically-Based Rendering,意为基于物理的渲染,是一种能对光在物体表面的真实物理反应提供精确渲染的方法,也是近年来极其生猛的3D工业趋势。 《The PBR Gu
腾讯ISUX
2020/03/23
1.5K0
ISUX译文 | The PBR Guide 基于物理的渲染指引(上)
腾讯ISUX isux.tencent.com 社交用户体验设计 《The PBR Guide》是由Substance by Adobe,Demo Artist Team负责人Wes McDermott主笔,并由3D领域各路专家共同编制的PBR指引手册。本书分为“物理现象浅析”及“材质制作指南”两大部分,从理论到实践,深度解析PBR工作流。 近日在研究3D-TO-H5工作流及学习PBR的过程中,发现Substance官方新版的《The PBR Guide》尚未有完整的中文翻译,所以把心一横,
腾讯ISUX
2020/01/13
1.9K0
ISUX译文 | The PBR Guide 基于物理的渲染指引(上)
Unity通用渲染管线(URP)系列(一)——自定义渲染管线(Taking Control of Rendering)
这篇是自定义可编程管线的教程的第一部分,它创建一个基础的渲染管线资源,为后面的教程提供基础。
放牛的星星
2020/12/11
18K1
Unity通用渲染管线(URP)系列(一)——自定义渲染管线(Taking Control of Rendering)
视频中为什么需要这么多的颜色空间?
 点击上方“LiveVideoStack”关注我们 ▲扫描图中二维码或点击阅读原文▲ 了解音视频技术大会更多信息 ---- 作者:王伟 编辑:Alex 图片来源:Unsplash (by Marques Kaspbrak) 在视频处理中,我们经常会用到不同的色彩空间:非线性 RGB、线性 RGB、YUV、XYZ……为什么需要这么多的色彩空间呢?为什么在FFmpeg中会有 color_space,color_transfer,color_primaries 等一系列的颜色属性呢?这些术语之间究竟隐藏着什
LiveVideoStack
2022/09/20
1.1K0
视频中为什么需要这么多的颜色空间?
Midjourney|文心一格 Prompt:完整参数列表、风格汇总、文生图词典合集
https://github.com/thinkingjimmy/Learning-Prompt
汀丶人工智能
2023/05/20
1.7K0
Midjourney|文心一格 Prompt:完整参数列表、风格汇总、文生图词典合集
甄建勇:五分钟搞不定系列-打通软硬件的任督二脉(1)
甄建勇,高级架构师(某国际大厂),十年以上半导体从业经验。主要研究领域:CPU/GPU/NPU架构与微架构设计。感兴趣领域:经济学、心理学、哲学。
Linux阅码场
2021/12/13
1.1K0
甄建勇:五分钟搞不定系列-打通软硬件的任督二脉(1)
iOS开发CoreGraphics核心图形框架之三——颜色与色彩空间
    颜色的实质是表示颜色的二进制数据,如果没有确定的规则,则这些二进制数据完全没有意义。所谓色彩空间,即是表示这些颜色数据信息是如何解释的。同样的一张图片,在不同的色彩空间下,其渲染的模样将有很大的不同。在CoreGraphics框架中,与色彩相关的功能主要有CGColor与CGColorSpace构成。
珲少
2018/08/15
1.5K0
iOS开发CoreGraphics核心图形框架之三——颜色与色彩空间
音视频知识图谱 2022.11
前些时间,我在知识星球上创建了一个音视频技术社群:关键帧的音视频开发圈,在这里群友们会一起做一些打卡任务。比如:周期性地整理音视频相关的面试题,汇集一份音视频面试题集锦,你可以看看这个合集:音视频面试题集锦。再比如:循序渐进地归纳总结音视频技术知识,绘制一幅音视频知识图谱,你可以看看这个合集:音视频知识图谱。
关键帧
2023/02/14
1K0
音视频知识图谱 2022.11
【Maxon App无法登录(红移渲染器无法开启)】
以win10为例 服务没有正常启动,在桌面任务栏右键,选择任务管理器或者CTRL+shift+del快速启动任务管理器
magize
2023/07/11
1.7K0
【Maxon App无法登录(红移渲染器无法开启)】
推荐阅读
相关推荐
ISP Pipeline | camera成像原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验