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.53981633974483
    console.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=name
        o.time=time
        o.type=type
        o.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 论语

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Win11·Copilot] Win11 系统更新重启后任务栏 Copilot 图标突然消失 | 解决方案

文章目录 前言Copilot介绍产生异常的原因解决方案总结 前言 在 Windows 11 的最新系统更新之后,一些用户报告了任务栏中 Copilot 图标消失的问题。这篇技术博文将为您提供详细的解决方案,帮助您恢复 Copilot 图标,并确保您能够继续享受 Copi…

设计模式——迭代器模式15

迭代器模式提供一种方法访问一个容器对象中各个元素&#xff0c;而又不需暴露该对象的内部细节。 设计模式&#xff0c;一定要敲代码理解 抽象迭代器 /*** 迭代抽象* */ public interface Iterator<A> {A next();boolean hasNext(); }迭代器实现 /*** author ggbond*…

git工具上传文件超过100MB解决方法

Github 上传超过100M的大文件 - 简书 (jianshu.com) 看到一个不错的贴子。 29660DESKTOP-CAB6SQB MINGW64 /d/predict-system $ git init Initialized empty Git repository in D:/predict-system/.git/29660DESKTOP-CAB6SQB MINGW64 /d/predict-system (master) $ git lfs tr…

2024年mathorcup数学建模C题思路分析-物流网络分拣中心货量预测及人员排班

# 1 赛题 C 题 物流网络分拣中心货量预测及人员排班 电商物流网络在订单履约中由多个环节组成&#xff0c;图 ’ 是一个简化的物流 网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包裹按照不同 流向进行分拣并发往下一个场地&#xff0c;最终使包裹…

BERT论文解读及情感分类实战

文章目录 简介BERT文章主要贡献BERT模型架构技术细节任务1 Masked LM&#xff08;MLM&#xff09;任务2 Next Sentence Prediction (NSP)模型输入 下游任务微调GLUE数据集SQuAD v1.1 和 v2.0NER 情感分类实战IMDB影评情感数据集数据集构建模型构建超参数设置训练结果注意事项 简…

重生奇迹MU圣导师与弓箭手职业对比

职业定位对比 在职业定位上&#xff0c;弓箭手是一个远程物理输出职业&#xff0c;不过弓箭手也有一定的辅助能力&#xff0c;可以为队友提供控场效果&#xff0c;还能为队友提供一个攻击力加成BUFF。同时弓箭手也是一个非常需要操作的职业&#xff0c;想要玩好这个职业&#…

Springboot整合mybatis_plus + redis(使用原生的方式)

首次&#xff0c;创建一个springboot项目&#xff0c;勾选相应的依赖Lombok、Web 添加依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>…

SpringBoot-自定义Starter精华版

SpringBoot自定义Starter精华版 一、自定义 Starter 分析 项目首先加载 starter,starter加载自动配置类&#xff0c;然后再通过配置绑定对象读取配置属性&#xff0c;注册组件。 二、实现步骤 ​ 开发的自定义 Starter 需求是&#xff0c;项目依赖starterTest-spring-boot-s…

C++界面设计之道:利用Qt框架构建优雅高效的应用程序

引言 Qt是一款强大的跨平台C图形用户界面&#xff08;GUI&#xff09;应用程序开发框架&#xff0c;以其丰富的功能、高效的性能、优雅的API以及出色的跨平台能力深受开发者喜爱。本篇文章将以《C界面如何设计Qt程序&#xff1f;》为主题&#xff0c;详细介绍如何利用Qt框架设…

python路径不对安装不了pip文件

因为特殊原因改变了路径&#xff0c;所以原来安装的路径不对无法通过环境变量的改变来完成安装&#xff0c;解决方法&#xff1a; 1.卸载重新安装&#xff0c;在安装界面会出现一个界面&#xff0c;直接打勾&#xff0c;安装结束后路径会配置完成 2在环境变量与用户变量处键入…

小程序 SSL证书的重要性与选择

随着移动互联网的迅猛发展&#xff0c;微信小程序已成为众多企业和开发者连接用户的重要平台。然而&#xff0c;随之而来的是对数据安全和隐私保护的严峻挑战。在这一背景下&#xff0c;小程序SSL证书的作用变得尤为重要&#xff0c;它为小程序提供了一个安全的通信管道&#x…

分享几个有趣实用的冷知识,涨姿势了

之前分享过分享几个有趣实用的冷知识&#xff0c;涨姿势了 &#xff0c;今天再补充分享些实用冷知识&#xff0c;持续更新&#xff0c;建议收藏这篇文章。 1.很多人不知道安卓软件文件名后缀apk&#xff0c;ios软件文件名后缀ipa&#xff0c;mac软件文件名后缀dmg&#xff0c;…

项目5-博客系统2(实现登录-令牌技术)

1.实现登录 分析 传统思路: • 登陆⻚⾯把⽤⼾名密码提交给服务器. • 服务器端验证⽤⼾名密码是否正确, 并返回校验结果给后端 • 如果密码正确, 则在服务器端创建 Session . 通过 Cookie 把 sessionId 返回给浏览器 问题: 集群环境下⽆法直接使⽤Session. 原因分析:…

【c 语言】结构体的定义格式及变量初始化

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

Python零基础从小白打怪升级中~~~~~~~SQLAlchemy的介绍

第四节&#xff1a;SQLAlchemy操作数据库 一、SQLAlchemy介绍 SQLAlchemy 是 Python 中一个通过 ORM 操作数据库的框架。 SQLAlchemy对象关系映射器提供了一种方法&#xff0c;用于将用户定义的Python类与数据库表相关联&#xff0c;并将这些类&#xff08;对象&#xff09;…

SpringAI初体验之HelloWorld

目录 前言1.准备工作2.初始化项目3.解决问题3.1 Connection Time out 连接超时问题3.2 You exceeded your current quota 额度超限问题 4.访问调用5.总结 前言 在逛SpringBoot页面时突然看到页面上新增了一个SpringAI项目,于是试了一下&#xff0c;感觉还行。其实就是封装了各家…

C语言处理文本模板:格式信函编程

开篇 本篇文章的问题来源为《编程珠玑》第3章其中一个问题&#xff0c;格式信函编程。说白了就是先在文件中定义一个文本模版&#xff0c;然后使用数据库中的数据去填充这个模版&#xff0c;最后得到填充后的文本&#xff0c;并输出。 问题概要 在常去的网店键入你的名字和密码…

LiveGBS流媒体平台GB/T28181功能-国标级联中如何自定义通道国标编号编辑通道编号保持唯一性

LiveGBS国标级联中如何自定义通道国标编号编辑通道编号保持唯一性 1、国标级联选择通道修改2、通道编辑修改3、分屏展示设备树修改3.1、编辑名称中修改 4、分屏展示分组修改4.1、编辑名称中修改4.2、选择通道中修改 5、搭建GB28181视频直播平台 1、国标级联选择通道修改 国标级…

graylog使用Sidecars方式收集springboot程序的日志

1、部署graylog后台服务 使用docker-compose启动三个服务程序&#xff0c;包括graylog、mongodb、opensearch。 docker-compose.yml内容如下 version: 3 services: # MongoDB: https://hub.docker.com/_/mongo/ mongodb: image: mongo:6.0.14 privileged: true …

BGP扩展知识总结

一、BGP的宣告问题 在BGP协议中每台运行BGP的设备上&#xff0c;宣告本地直连路由在BGP协议中运行BGP协议的设备&#xff0c;来宣告通过IGP学习到的未运行BGP协议设备产生的路由&#xff1b;&#xff08;常见&#xff09; 在BGP协议中宣告本地路由表中路由条目时&#xff0c;将…