TypeScript 设计模式之【抽象工厂模式】

news2024/11/16 16:43:46

文章目录

  • 抽象工厂模式:一个神奇的玩具制造商
    • 主要思想:玩具制造商的秘密
    • 这个制造商有什么好处和坏处?
    • 如何打造这个神奇的玩具制造商?
    • 代码实现案例
    • 抽象工厂模式主要优点
    • 抽象工厂模式主要缺点
    • 抽象工厂模式适用场景
    • 总结


在这里插入图片描述

抽象工厂模式:一个神奇的玩具制造商

想象一下,你有一个神奇的玩具制造商,可以制造各种主题的玩具套装,比如"海洋世界"或"太空探险"。这就是抽象工厂模式的本质!

主要思想:玩具制造商的秘密

那么每个主题(比如海洋世界)就是一个"产品家族",制造商(工厂)可以生产该主题的所有玩具,你只需告诉制造商你想要哪个主题,而不用关心具体怎么做,就像你不需要知道玩具是如何制造的,你只需选择主题,然后享受玩具,你不想操心每个玩具怎么做,只想专注于玩,你想轻松切换主题,比如从海洋世界换成太空探险!

这个制造商有什么好处和坏处?

在确保所有玩具风格一致的情况下,就不会出现海豚在太空船里的尴尬情况,你不用记住每个玩具的制作方法,省心省力,想加入新主题或新玩具很容易,不影响已有的玩具。当然,他的小缺点就是可能会有很多种类的玩具和主题,管理起来有点复杂罢了。

如何打造这个神奇的玩具制造商?

  1. 设计每种玩具的基本样子(抽象产品)
  2. 制作具体的玩具(具体产品)
  3. 设计制造商的基本能力(抽象工厂)
  4. 创建能制造特定主题玩具的制造商(具体工厂)
  5. 开始使用制造商来获得你想要玩的主题玩具!

通过这种方式,你可以轻松地获得各种主题的玩具套装,而不用关心它们是如何制造的。这就是抽象工厂模式的魔力所在!

代码实现案例

// 抽象产品(玩具)
interface Toy {
    play(): void;
}

// 具体产品(海洋玩具)

class OceanToy implements Toy {
    play(): void {
        console.log("Playing with ocean toy");
    }
}

// 具体产品(太空玩具)
class SpaceToy implements Toy {
    play(): void {
        console.log("Playing with space toy");
    }
}

// 抽象工厂(玩具制造商)
interface ToyFactory {
    createToy(): Toy;
}       


// 具体工厂(海洋玩具制造商)
class OceanToyFactory implements ToyFactory {
    createToy(): Toy {
        return new OceanToy();
    }
}

// 具体工厂(太空玩具制造商)
class SpaceToyFactory implements ToyFactory {
    createToy(): Toy {
        return new SpaceToy();
    }
}

// 使用海洋玩具制造商
const oceanToyFactory = new OceanToyFactory();
// 使用海洋玩具制造商创建海洋玩具
const oceanToy = oceanToyFactory.createToy();
// 使用海洋玩具
oceanToy.play(); // 输出: Playing with ocean toy

// 使用太空玩具制造商
const spaceToyFactory = new SpaceToyFactory();
// 使用太空玩具制造商创建太空玩具
const spaceToy = spaceToyFactory.createToy();
// 使用太空玩具
spaceToy.play(); // 输出: Playing with space toy

在这里插入图片描述

抽象工厂模式主要优点

  1. 封装性:将对象的创建逻辑封装在工厂类中,客户端代码不需要了解具体的创建过程。
  2. 易于扩展:添加新的具体工厂和产品非常容易,符合开闭原则。
  3. 一致性:确保同一工厂创建的产品相互匹配。

抽象工厂模式主要缺点

  1. 复杂性:随着产品族的增加,工厂类和产品类的数量也会增加,导致系统变得复杂。
  2. 性能开销:每次创建产品时,都需要通过工厂类,可能会引入一定的性能开销。

抽象工厂模式适用场景

  1. 需要创建一系列相关或依赖对象时:例如,创建不同类型的按钮和文本框。
  2. 需要确保产品的一致性时:例如,创建不同类型的文档和打印设置。

总结

抽象工厂模式是一种强大且灵活的设计模式,适用于需要创建一系列相关或依赖对象的场景。本篇通过将对象的创建逻辑封装在工厂类中,实现了对象的创建与使用的分离,从而提高了系统的灵活性和可扩展性。


喜欢的话就点个赞❤️,关注一下吧,有问题也欢迎讨论指教。感谢大家!!!

下期预告:TypeScript 设计模式之【生成器】

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

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

相关文章

(done) 声音信号处理基础知识(7) (Understanding Time Domain Audio Features)

参考:https://www.youtube.com/watch?vSRrQ_v-OOSg&t1s 时域特征包括: 1.幅度包络 2.均方根能量 3.过零率 振幅包络的定义:一个 frame 里,所有采样点中最大的振幅值 一个形象的关于振幅包络的可视化解释如下:…

基于SpringBoot + Vue的大学生日常消费管理系统设计与实现

文章目录 前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S 四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论 五、项目代码参考六、数据库代码参考七、项目论文示例结语 前言 💛博主介绍&a…

fiddler抓包07_抓IOS手机请求

课程大纲 前提:电脑和手机连接同一个局域网 (土小帽电脑和手机都连了自己的无线网“tuxiaomao”。) 原理如下: 电脑浏览器抓包时,直接就是本机网络。手机想被电脑Fiddler抓包,就要把Fiddler变成手机和网络…

浅拷贝和深拷贝(Java 与 JavaScript)

一、Java 浅拷贝和深拷贝 在Java中,浅拷贝和深拷贝的主要区别在于对对象的引用和内容的复制方式。 浅拷贝 Java 的类型有基本数据类型和引用类型,基本数据类型是可以由 CPU 直接操作的类型,无论是深拷贝还是浅拷贝,都是会复制出…

ANSYS Workbench晶体结构Voronoi泰森多边形建模

在ANSYS Workbench内建立包含晶格及晶格边界在内的晶体结构模型,可用于模拟多种物理现象及材料行为。晶格模型适用于研究微观尺度下的材料性质,以及它们如何影响宏观性能,如进行金属晶体结构建模及断裂的模拟等。 晶体结构模型可采用CAD Vo…

fastapp-微信开发GPT项目第一课

0. 开发说明 在学习开发本项目之前,必须保证有以下知识储备和环境工具。 技术栈说明python>3.9、pydantic>2.7.1python基础,http协议fastapi>0.111.0web协程异步框架,有web开发基础,异步编程,类型标注[pyth…

银河麒麟操作系统中查看动态库函数的方法

银河麒麟操作系统中查看动态库函数的方法 1、查看单个动态库中的函数2、查找特定函数位于哪个动态库中 💖The Begin💖点点关注,收藏不迷路💖 在Linux系统,包括银河麒麟操作系统中,动态库(.so文件…

单片机项目合集列表与专栏说明——Excel合集列表目录查阅(持续更新)

阿齐Archie《单片机项目合集》专栏项目 为方便查找本专栏的项目,特整理Excel合集列表供查阅(可搜索或按系列查找) 持续更新链接如下: 阿齐单片机项目合集 (kdocs.cn)https://www.kdocs.cn/l/cmrxCxJN05YN 打开链接如下Exce表所…

【LeetCode:219. 存在重复元素 II + 哈希表】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

人工智能领域-----机器学习和深度学习的区别

机器学习和深度学习都是人工智能领域中的重要概念,它们之间存在以下一些区别: 一、定义与概念 机器学习: 是一种让计算机自动学习和改进的方法,通过从数据中学习模式和规律,从而能够对新的数据进行预测或决策。涵盖了…

Android compose 的基本环境搭建

1.创建项目 导入版本 1.gradle/libs.versions.toml [versions] accompanistPermissions "0.36.0" agp "8.5.0-beta01" coilCompose "2.7.0" constraintlayoutComposeVersion "1.0.1" hiltAndroid "2.51.1" hiltNavi…

git其他人有改动,自己这边不要pull,先stash一下,pull了然后apply自己的stash。

git其他人有改动,自己这边不要pull,先stash一下,pull了然后apply自己的stash, git 冲突了怎么处理处理? git会提示冲突的文件 On branch experiments You have unmerged paths.(fix conflicts and run "git comm…

代码随想录 -- 回溯 -- 子集II

90. 子集 II - 力扣(LeetCode) 思路: 题目中说明nums中可能包含重复元素,所以要去重。 去重的前提是将数组nums排序! 递归参数:nums,index,path递归出口:当遍历完num…

编译和链接笔记

翻译环境和运⾏环境 在ANSI C的任何⼀种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执⾏的机器指令(⼆进制指令)。 第2种是执⾏环境,它⽤于实际执⾏代码。 1.翻译环境 其实翻译环境…

这3个证书在手,失业了也不怕.

在忙碌的职场生活中,考取一两个证书已成为众多职场人士的热门选择。 拥有这些证书不仅能为个人职业发展带来机遇,还能为职业转型铺平道路,特别是在主业遇到波折时。 接下来,让我们一同探索三个适合上班族的热门证书。 PMP认证&…

Unity 新NavMesh演示(1)

新版Navmash 导航寻路 保姆级入门讲解-CSDN博客 演示: 第一步 给场景中的BK添加导航网格表面组件 并设置详细参数 第二步 为player添加导航网格代理 并编写脚本设置target public class Text : MonoBehaviour {private NavMeshAgent agent;public Transform targe…

【从0开始自动驾驶】ros2编写自定义消息 msg文件和msg文件嵌套

【从0开始自动驾驶】ros2编写自定义消息 msg文件和msg文件嵌套 在工作空间内新建一个功能包在msg内创建对应的msg文件创建名为TestMsg.msg的文件创建名为TestSubMsg.msg的文件(在前一个msg文件中引用)修改CmakeList.txt修改package.xml文件编译 在工作空…

获取交易软件【热度排行数据】2024年9月26日,一股淡淡的牛味

2024年9月26日,一股淡淡的牛味 概念热度的排行榜和行业热度排行榜。 像是这种类型的数据,能不能加到我们的量化模型里面,作为选股和下单指令的判断条件之一呢? 下面图片,有很多数据接口,可以1对1帮助您解…

水面巡检船垃圾漂浮物检测系统源码分享

水面巡检船垃圾漂浮物检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of …