javaScript设计模式之简单工厂模式

        简单工厂模式(Simple Factory):又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。

场景一

假设我们需要计算圆形和矩形的面积

    function Circle(radius) {this.radius = radius;}Circle.prototype.getArea = function() {return Math.PI * this.radius * this.radius;};// 定义矩形构造函数function Rectangle(width, height) {this.width = width;this.height = height;}Rectangle.prototype.getArea = function() {return this.width * this.height;};// 定义简单工厂函数function ShapeFactory(shapeType, params) {var shape;if (shapeType === 'circle') {shape = new Circle(params.radius);} else if (shapeType === 'rectangle') {shape = new Rectangle(params.width, params.height);} else {throw new Error('请重新选择');}return shape;}// 使用简单工厂函数创建形状对象var circle = ShapeFactory('circle', { radius: 5 });var rectangle = ShapeFactory('rectangle', { width: 4, height: 10 });// 计算并打印形状的面积console.log('Circle area:', circle.getArea()); // 输出: Circle area: 78.53981633974483console.log('Rectangle area:', rectangle.getArea()); // 输出: Rectangle area: 40

两个构造函数CircleRectangle,它们分别表示圆形和矩形,并且都拥有一个getArea方法来计算面积。ShapeFactory是简单工厂函数,它接收一个形状类型shapeType和一个包含形状参数的params对象。根据shapeType的不同,工厂函数会创建并返回相应类型的形状对象。最后用ShapeFactory函数来创建圆形和矩形对象,并调用它们的getArea方法来计算面积。

场景二

创建不同类型的动物对象狗、猫。

    // 定义动物基类class Animal {constructor(name) {this.name = name;}speak() {console.log(`${this.name} 叫`);}}// 定义狗类class Dog extends Animal {speak() {console.log(`${this.name} 狗`);}}// 定义猫类class Cat extends Animal {speak() {console.log(`${this.name} 猫`);}}// 定义简单工厂类class AnimalFactory {static createAnimal(type, name) {let animal;switch (type) {case 'dog':animal = new Dog(name);break;case 'cat':animal = new Cat(name);break;default:throw new Error('Invalid animal type');}return animal;}}// 使用简单工厂创建动物对象let dog = AnimalFactory.createAnimal('dog', '旺财');let cat = AnimalFactory.createAnimal('cat', '小花');// 让动物发声dog.speak(); // 输出: 旺财 狗cat.speak(); // 输出: 小花 猫

定义了一个Animal基类,以及两个继承自Animal的子类DogCat。然后,我们创建了一个AnimalFactory简单工厂类,它有一个静态方法createAnimal,根据传入的类型参数type来创建并返回相应的动物对象。最后使用AnimalFactory来创建狗和猫的对象,并调用它们的speak方法。

场景三

创建不同类型的汽车对象

// 定义汽车构造函数
function Car(model, year, color) {this.model = model;this.year = year;this.color = color;
}// 定义简单工厂函数
function CarFactory() {}// 工厂函数的原型上添加创建汽车的方法
CarFactory.prototype.createCar = function (type) {switch (type) {case 'SUV':return new Car('SUV', 2022, 'black');case 'Sedan':return new Car('Sedan', 2021, 'white');case 'Hatchback':return new Car('Hatchback', 2020, 'blue');default:throw new Error('Invalid car type.');}
};// 使用简单工厂创建汽车对象
var factory = new CarFactory();
var suv = factory.createCar('SUV');
var sedan = factory.createCar('Sedan');
var hatchback = factory.createCar('Hatchback');console.log(suv);
console.log(sedan);
console.log(hatchback);

最终输入

  Car 构造函数用于创建汽车对象,而 CarFactory 则是一个简单工厂,用于根据指定的类型创建不同的汽车对象。

场景四

        比如说体育商品店卖体育器材,里面有很多体育用品,及其相关介绍等。当你来到体育用品店买一个篮球和足球等,你只需要问售货员,他会帮你找到你所要的东西。

    //蓝球let basketball=function(){this.intor="蓝球运动"}basketball.prototype={getMember:function () {console.log("需要的队员")},getBallsize:function () {console.log("蓝球很大")}}//足球let football=function () {this.intro="足球"}football.prototype={getMember:function () {console.log("需要11名队员")},getBallsize:function () {console.log("足球很大")}}//网球let tennis=function () {this.intro="每年有很多网球比赛"}tennis.prototype={getMember:function () {console.log("网球比赛很精彩")},getBallsize:function () {console.log("网球很好玩")}}//运动工大let sportsFactory=function (name) {switch (name) {case 'NAB':return new Basketball();case 'wordcup':return new football();case 'frenchopen':return new tennis()}}//进行使用 创建一个足球let footnall = sportsFactory('wordcup')console.log(footnall.intro)footnall.getMember()//需要11名队员

场景五

如果想创建一些书,那么这些书都有一些相似的地方,比如目录、页码等。也有一些不相似的地方,如书名、出版时间、书的类型等,对于创建的对象相似的属性好处理,对于不同的属性就要有针对性地进行处理了,比如我们将不同的属性作为参数传递进行处理。

    function createBook(name,time,type) {//创建一个对象,并对对象拓展属性和方法let o = new Object()o.name=nameo.time=timeo.type=typeo.getName=function () {console.log(this.name,this.time,this.type)}//将对象返回return o}let book1=createBook('语文',2024,'海')let book2=createBook('国学',2024,'论语')book1.getName()//语文 2024 海book2.getName()//国学 2024 论语

总结:通过对简单工厂模式来创建一些对象,可以让这些对象共用一些资源而又私有一些资源。不过对于简单工厂模式,它的使用场合通常也就限制在创建单一对象。

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

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

相关文章

总结SQL相对常用的几个字符函数

目录 字符的截取 substr() trim()、ltrim()、rtrim() 字符串的拼接 ||、 字符的大小写转换 upper(column_name):大写 lower(column_name):小写 字符替换 replace() 搜索字符 instr(column_name, substring_to_find,start,n_appearence) charindex(substring_to_fi…

【问题解决】ubuntu安装新版vscode报code-insiders相关错误

问题 目前 vscode官网 最新的包为 insiders_1.89.0-1712297812_amd64.deb ,双击或者使用sudo dpkg -i code-insiders_1.89.0-1712297812_amd64.deb安装后报错,执行其他命令也报错。 安装环境:ubuntu18.04 dpkg: 处理软件包 code-insiders (…

火绒安全软件:程序员的网络守护天使

目录 前言 系统防护 网络防护 隐私保护 高级设置 软件安全 响应速度 持续更新 总结 前言 在这个充满机遇与挑战的数字时代,程序员们如同探险家,不断探索着代码的新大陆。然而,网络世界也充斥着各种未知的风险和威胁。火绒安全软件&a…

基于java+springboot+vue实现的药品管理系统(文末源码+Lw)23-297

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,药品信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…

llama-factory SFT系列教程 (二),大模型在自定义数据集 lora 训练与部署

文章目录 简介支持的模型列表2. 添加自定义数据集3. lora 微调4. 大模型 lora 权重,部署问题 参考资料 简介 llama-factory SFT系列教程 (一),大模型 API 部署与使用本文为 llama-factory SFT系列教程的第二篇; 支持的模型列表 模型名模型…

Composer安装与配置

Composer,作为PHP的依赖管理工具,极大地简化了PHP项目中第三方库的安装、更新与管理过程。本文将详细介绍Composer的安装步骤、基本配置方法,以及一些实用的操作示例,帮助读者快速上手并熟练运用Composer。 一、Composer安装 环…

C++内存分布

C代码编译过程 预处理 宏定义展开、头文件展开、条件编译,这里并不会检查语法编译检查语法,将预处理后文件编译生成汇编文件汇编将汇编文件生成目标文件(二进制文件)链接将目标文件链接为可执行程序 进程的内存分布 程序运行起来(没有结束前)就是一个…

SQL Server 存储函数(funGetId):唯一ID

系统测试时批量生成模拟数据,通过存储函数生成唯一ID。 根据当前时间生成唯一ID(17位) --自定义函数:根据当前时间组合成一个唯一ID字符串:yearmonthdayhourminutesecondmillisecond drop function funGetId;go--自定义函数&…

2024年MathorCup数学建模B题甲骨文智能识别中原始拓片单字自动分割与识别研究解题文档与程序

2024年第十四届MathorCup高校数学建模挑战赛 B题 甲骨文智能识别中原始拓片单字自动分割与识别研究 原题再现: 甲骨文是我国目前已知的最早成熟的文字系统,它是一种刻在龟甲或兽骨上的古老文字。甲骨文具有极其重要的研究价值,不仅对中国文…

2024年MathorCup数模竞赛C题详解

C题持续更新中 问题一问题二代码混合ARIMA-LSTM模型构建完整数据与代码第一问第二问 问题一 问题一要求对未来30天每天及每小时的货量进行预测。首先,利用混合ARIMA-LSTM模型进行时间序列预测。ARIMA模型擅长捕捉线性特征和趋势,而LSTM模型处理非线性关…

elementui中el-select下拉列表偏移问题

问题截图 解决方法 在el-select中添加:popper-append-to-body"false"即可 加完后的效果

Leetcode刷题之轮转数组

Leetcode刷题之轮转数组 一、题目描述二、题目解析方法一:三段逆置题目代码 方法二:利用memcpy进行拷贝运行结果 一、题目描述 轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums […

使用夜神模拟器进行android开发

1. 安装 进入 夜神模拟器官网 进行下载安装 2. 使用 找到夜神模拟器安装路径下的 bin 文件夹:C:\Program Files (x86)\Nox\bin 切换到 bin 目录之后,输入以下命令连接模拟器: nox_adb connect 127.0.0.1:62001 在启动 android 项目前&…

机器学习—数据集(二)

1可用数据集 公司内部 eg:百度 数据接口 花钱 数据集 学习阶段可用的数据集: sklearn:数据量小,方便学习kaggle:80万科学数据,真实数据,数据量大UCI:收录了360个数据集,覆盖科学、生活、经济等…

书生·浦语大模型实战营 | 第3次学习笔记

前言 书生浦语大模型应用实战营 第二期正在开营,欢迎大家来学习。(参与链接:https://mp.weixin.qq.com/s/YYSr3re6IduLJCAh-jgZqg 第三堂课的视频链接:https://www.bilibili.com/video/BV1QA4m1F7t4/ 本次笔记是学习完第三堂课…

数据结构课程设计(七)---求图的中心顶点 [图]

1.7.1 题目内容 1.7.1-A [问题描述] 假设有一个公司在某个地区有n个产品销售点,现根据业务需要打算在其中某个销售点上建立一个中心仓库,负责向其它销售点提供产品。由于运输线路不同,运输费用也不同。假定每天需要向每个销售点运输一次产品…

伪装目标检测论文阅读之:《Confidence-Aware Learning for Camouflaged Object Detection》

论文地址:link code:link 摘要:   任意不确定性捕获了观测结果中的噪声。对于伪装目标检测,由于伪装前景和背景的外观相似,很难获得高精度的注释,特别是目标边界周围的注释。我们认为直接使用“嘈杂”的伪装图进行训…

【InternLM 实战营第二期-笔记1】书生浦语大模型开源体系详细介绍InternLM2技术报告解读(附相关论文)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型,很高兴能参与本次第二期训练营,我也将会通过笔记博客的方式记录学习的过程与遇到的问题,并为代码添加注释,希望可以帮助到你们。 记得点赞哟(๑ゝω╹๑) 书生浦语大模型开源体系…

Zookeeper中的节点类型和实现持久化的两种方式

进入zookeeper的bin目录,执行./zkServer.sh start ../conf/zoo.cfg启动! Zookeeper内部的数据模型 类似于数据结构中的树,同时也很像文件系统的目录, 节点的类型 持久节点:create /znode 创建出的节点&#xff0c…

Shell脚本学习(一):Shell入门与Shell变量

Shell学习章节目录 Shell入门与Shell变量。 Shell内置命令。 Shell运算符与执行运算命令。 流程控制语句。 Shell函数。 Shell重定向。 Shell好用的工具,cut sed awk sort。 大厂常见企业面试题。 Shell入门:介绍 对于入门,我们需要知道几…