javaScript设计模式-工厂

它的好处是消除对象间的耦合度,在派生子类时提供了更大的灵活性。但盲目的把普通的构造函数扔在一边,并不值得提倡。如果要采一不可能另外换用一个类,或都不需要在运行期间在一系列可互换的类中进行选择,就不应该使用。这样在后期代码重构时还有机会使用。

简单工厂

这种方式只能处理一个工厂只生产一个品牌的商品,如果生产不同品牌的商品时,此方式就行不通了。

var BicycleFactory = {//把生产Bicycle的工作全部放在工厂类中
    createBicycle: function(model) {
        var bicycle;
        switch(model) {
            case 'The Speedster':
                bicycle = new Speedster();
                break;
            case 'The Lowrider':
                bicycle = new Lowrider();
                break;
            default:
                bicycle = new ComfortCruiser();
        }
//接口在工厂模式中起着很重要的作用,如果不对对象进行某种类型的检查以确保其实现了必要的方法,那  么工厂模式带来的好处就基本没有了,此接口是用第一章的内容创建的
        Interface.ensureImplements(bicycle, Bicycle);
        return bicycle;
    }
};
var BicycleShop = function() {};
BicycleShop.prototype = {
    sellBicycle: function(model) {
        var bicycle = BicycleFactory.createBicycle(model);
        bicycle.assemble();
        bicycle.wash();
        return bicycle;
    }
};
/* The Bicycle interface. */
var Bicycle = new Interface('Bicycle', ['assemble', 'wash', 'ride','repair']);
var Speedster = function() { // implements Bicycle
};
Speedster.prototype = {
    assemble: function() {
    },
    wash: function() {
    },
    ride: function() {
    },
    repair: function() {
    }
};
var t = new BicycleShop();
var a = t.sellBicycle("The Speedster");
console.log(a);

如果需要提供几种不同品牌的自行车时,更恰当的做法是把这个创建方法实现在一个类中,并从此类派生出一些子类。

工厂模式

这个例子需要对上面的简单工厂进行一些修改。工厂是将其成员对象的实例化推迟到子类中进行的类。而简单工厂其成员对象是由工厂类创建的。

/* 抽象的自行车商店(abstract). */
var BicycleShop = function() {};
BicycleShop.prototype = {
    sellBicycle: function(model) {
        var bicycle = this.createBicycle(model);
        bicycle.assemble();
        bicycle.wash();
        return bicycle;
    },
    createBicycle: function(model) {
        throw new Error('Unsupported operation on an abstract class.');
    }
};

/* AcmeBicycleShop class extends BicycleShop,
由具体的子类决定从哪家进货,卖什么牌子的自行车. */
var AcmeBicycleShop = function() {};
extend(AcmeBicycleShop, BicycleShop);//****
AcmeBicycleShop.prototype.createBicycle = function(model) {
    var bicycle;
    switch(model) {
        case 'The Lowrider':
            bicycle = new Speedster();
            break;
        default:
            bicycle = new AcmeComfortCruiser();
    }
    Interface.ensureImplements(bicycle, Bicycle);
    return bicycle;
};
/* GeneralProductsBicycleShop class.另一个商店 */

/* The Bicycle interface. */
var Bicycle = new Interface('Bicycle', ['assemble', 'wash', 'ride','repair']);
var Speedster = function() { // implements Bicycle
};
Speedster.prototype = {
    assemble: function() {
    },
    wash: function() {
    },
    ride: function() {
    },
    repair: function() {
    }
};
/* Usage. */
var alecsCruisers = new AcmeBicycleShop();
var yourNewBike = alecsCruisers.sellBicycle('The Lowrider');

通常要与一系列实现了同一接口、可以被同等对待的类打交道,或是初始化数据或是动态加载库时用工厂模式比较方便。同样也可以实现组合工厂。其实就是把小件组装在一个大工厂类中,做为对象返回。

var FeedManager = {
  createFeedReader: function(conf) {
    var displayModule = new ListDisplay(conf.id + '-display', conf.parent);
    Interface.ensureImplements(displayModule, DisplayModule);
    var xhrHandler = XhrManager.createXhrHandler();
    Interface.ensureImplements(xhrHandler, AjaxHandler);
    //三个参数代表了三个小工厂。FeedReader是一个组合后的大工厂
    return new FeedReader(displayModule, xhrHandler, conf);
  }
};

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

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

相关文章

虚拟环境中pip install不生效的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

全网首发 2024华数杯B题成品论文word52页(附带所有可执行代码+和高质量数据)

基于数据分析下的光伏发电 摘 要(文末获取) 根据最新数据,中国的总发电量超过20万亿千瓦时,总体排名世界第一,而光伏发电是一种重要的可再生能源,可以将太阳能转化为电能可以减少对传统能源的依赖&#x…

本地运行LlaMA 2的简易指南

大家好,像LLaMA 2这样的新开源模型已经变得相当先进,并且可以免费使用。可以在商业上使用它们,也可以根据自己的数据进行微调,以开发专业版本。凭借其易用性,现在可以在自己的设备上本地运行它们。 本文将介绍如何下载…

Python 语言零基础入门,需要做哪些准备?

Python 语言零基础入门,需要做哪些准备? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「Python的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家&…

专题页设计不再困扰,3个实例揭示简单技巧!

特别页面是电子商务领域设计的重要组成部分。销售能否取决于这里的活动运营水平。除了每年固定的节假日外,电子商务平台还会在季节变化、开学季节等时间点举办大型促销活动,有时还会自己制作节日。这些活动都涉及到特别页面的设计。在这篇文章中&#xf…

pyrender复现pytorch3d渲染结果

pyrender复现pytorch3d渲染结果 一、写在前面1.1 pyrender渲染时间 ≈ 0.02s1.2 Pytorch3D渲染时间 ≈ 4s 二、pytorch3d的渲染函数2.1 PyTorch3D 库创建了一个颜色渲染器(color_renderer)对象,并配置了相机、光照和渲染设置。2.2 PyTorch3D …

旅游项目day03

1. 前端整合后端发短信接口 2. 注册功能 后端提供注册接口,接受前端传入的参数,创建新的用户对象,保存到数据库。 接口设计: 实现步骤: 手机号码唯一性校验(后端一定要再次校验手机号唯一性&#xff09…

【图形学】颜色线性插值和Wu反走样算法

颜色线性插值 绘制一条颜色渐变的直线,直线上每一个点的颜色都来自端点颜色的线性插值。线性插值公式为 P ( 1 − t ) P s t a r t t P e n d P 是直线上任意一个点, P s t a r t 是直线的起点, P e n d 是直线的终点 对应直线上任意一点…

gin+gorm增删改查目录框架

从网上找资料,发现,很多都是直接的结构 路由,后端的controller层,还有model层,都是放在了同一个main.go文件中,如果写项目的话,还得自己去拆文件,拆代码,经过查询和自己总结,下面放…

计算机网络——数据链路层(1)

一、概述 在计算机网络中,数据链路层承担着点对点通信的任务,用于跨物理层在网段节点之间参数数据。它在网络分层中处于物理层之上,网路层之下。 在链路层的讨论中,我们将看到两种截然不同类型的链路层信道。第一种类型是广播信道…

数字身份所有权:Web3时代用户数据的掌控权

随着Web3时代的来临,数字身份的概念正焕发出崭新的光芒。在这个数字化的时代,用户的个人数据变得愈加珍贵,而Web3则为用户带来了数字身份所有权的概念,重新定义了用户与个人数据之间的关系。本文将深入探讨Web3时代用户数据的掌控…

【竞技宝】DOTA2:世一C遇到瓶颈? yatoro直言一号位上分太难了

北京时间2024年1月18日,spirit在去年再次拿到了TI国际邀请赛的冠军,成为了OG之后第二支两次在世界赛夺冠的战队,在夺冠之后,spirit直接给选手们放了假。此前AR夺冠的ESL吉隆坡站的比赛,spirit战队就并未参加&#xff0…

视频转码实例:把MP4转为MKV视频,一键批量转换的操作方法

在数字媒体时代,视频格式的多样性是不可避免的。经常把MP4格式的视频转换为MKV格式。MKV格式有较高的音频和视频质量,能在其他设备或软件上播放视频。以下是云炫AI智剪如何把MP4视频转为MKV格式的一键批量转换操作方法。 已转码的mkv视频效果缩略图展示…

kubernetes pod 高级

一、pod资源限制 1、什么是pod的资源限制 在Kubernetes集群中,为了使系统能够稳定的运行,通常会对Pod的资源使用量进行限制。 在Kubernetes集群中,如果有一个程序出现异常,并占用大量的系统资源。如果未对该Pod进行资源限制的话…

Git学习笔记(第4章):Git分支

目录 4.1 分支的概述 4.1.1 什么是分支 4.1.2 分支的好处 4.2 查看分支(查) 4.3 创建分支(增) 4.4 切换分支 4.5 修改分支(改) 4.6 合并分支(正常合并) 4.7 合并分支&#…

CGAL最小生成树、可视化

CGAL 5.4.5 - Surface Mesh: User Manual 1、Kruskal计算最小生成树 #include <CGAL/Simple_cartesian.h> #include <CGAL/Surface_mesh.h> #include <boost/graph/kruskal_min_spanning_tree.hpp> #include <iostream> #include <fstream> #inc…

贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现

目录 参考链接 定义 直观理解 公式推导 一次贝塞尔曲线&#xff08;线性公式&#xff09; 二次贝塞尔曲线&#xff08;二次方公式&#xff09; 三次贝塞尔曲线&#xff08;三次方公式&#xff09; n次贝塞尔曲线&#xff08;一般参数公式&#xff09; 代码实现 参考链接…

群晖NAS搭建WebDav结合内网穿透实现公网访问本地影视资源

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

2024华数杯国际数学建模B题思路+代码+模型+论文

2024华数杯国际数学建模B题思路代码模型论文&#xff1a;1.17上午第一时间更新&#xff0c;详细内容见文末名片 问题B&#xff1a;光伏电 背景 中国的电力构成包括传统的能源发电&#xff08;如煤炭、石油和天然气&#xff09;、可再生能源发电 &#xff08;如水力发电、风能…

OpenGL:关于纹理映射时任意四边形中的插值问题(二)

OpenGL&#xff1a;关于纹理映射时任意四边形中的插值问题-CSDN博客 上次是使用逆双线性插值的方法解决四边形纹理映射时产生的折痕问题。 其实也有点问题&#xff0c;就是双线性插值会使得纹理产生一点扭曲。 不是投影的效果。 想达到纹理投影的效果&#xff0c;可以使用透…