【JS设计模式笔记】神奇的魔术师-简单工厂模式(创建型)
简单工厂模式(Simple Factory):又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。
第一次需求
开发一个登录模块的需求,用户名输入框如果输入的内容不符合规范就自定义一个警告框警示一句:‘用户名不能多于16个字母或数字’
var LoginAlert = function(text) {
this.content = text;
}
LoginAlert.prototype.show = function() {
// 显示警告框
}
var useNameAlert = new LoginAlert('用户名不能多于16个字母或数字');
useNameAlert.show();
关于用户密码输入错误也有一句提示:‘输入的密码不正确’。
var passwordAlert = new LoginAlert('输入的密码不正确');
passwordAlert.show();
又有一个需求,当用户登录时,如果出现用户名不存在,也提示一句:‘您的用户名不存在,请重新输入’。
这个时候又得重新创建一个类。
var LoginConfirm = function(text) {
this.content = text;
}
LoginConfirm.prototype.show = function() {
// 显示确认框
}
var loginFailConfirm = new LoginConfirm('您的用户名不存在,请重新输入');
loginFailConfirm.show();
现在登录成功后,又得需要一个自定义提示框,除了有确定取消按钮,也提示一句话:’欢迎回来‘。
这又是一个新的类:
var LoginPrompt = function(text) {
this.content = text;
}
LoginPrompt.prototype.show = function() {
// 显示提示框
}
现在需要开发一个注册模块,用需要用到提示框相关的功能。’
如果类太多,提供一个
以前的登录模块有三个类,分别为LoginAlert、LoginConfirm、LoginPrompt,还是以Login为前缀,现在来写个简单工厂,也即是封装一个函数,我们用这个函数创建我们需要的对象为我所用即可。这样其他人不用关心创建这个对象用到哪些基类,这样其他人只需要记住这个函数就可以了。这个函数通常也被称为工厂函数。
举个例子,比如一个会变魔术的魔法师,你想要魔法师给你变礼物,但是你不关心魔法师用什么来变的,你只需要这位魔法师就可以了。
例如体育商点售卖体育器材,里面有很多体育用品,及相关介绍等,当你需要买篮球的时候,只需要告诉售货员就可以,他会帮你找找到你想要的东西。
// 篮球基类
var Basketball = function() {
this.intro = '篮球盛行于美国';
}
Basketball.prototype = {
getMember: function() {
console.log('每个队伍需要5名队员');
},
getBallSize: function() {
console.log('篮球很大');
}
}
// 足球基类
var Football = function() {
this.intro = '足球很流行';
}
Football.prototype = {
getMember: function() {
console.log('每个队伍需要11名队员');
},
getBallSize: function() {
console.log('足球很大')
}
}
// 网球基类
var Tennis = function() {
this.intro = '网球介绍';
}
Tennis.prototype = {
getMember: function() {
console.log('每个队伍需要1名队员')
},
getBallSize: function() {
console.log('网球很少');
}
}
// 运动工厂
var sportsFactory = function(name) {
switch(name) {
case 'NBA':
return new Basketball();
case 'worldcup':
return new Football();
case 'frenchopen':
return new Tennis();
}
}
// 示例
var footBall = sportsFactory('worldcup');
console.log(footBall);
console.log(footBall.intro);
footBall.getMember();
那么自定义弹框可以这样实现:
var popFactory = function(name,text) {
switch(name) {
case 'alert':
return new LoginAlert(text);
case 'confirm':
return new LoginConfirm(text);
case 'prompt':
return new LoginConfirm(text);
}
}
var useNameAlert = popFactory('alert','用户名不能多于16个字母或数字');
useNameAlert.show()
一个对象有时也可代替许多类
从上面LoginAlert、LoginConfirm、LoginConfirm三个类,有很多地方是相同,比如都有关闭按钮,都有提示文案等,我们也可以抽象提取出来公用的,也可以用简单工厂的方式来实现它们。
举个例子,比如我想创建一些书,那些书都有一些相似的地方,比如目录、页码等。也有一些不相似的地方,比如书名、出版时间、书的类型等,对于创建的对象相似的属性好处理,对于不同的属性就要有针对性的进行处理了,比如我们将不同的属性作为参数传递进来处理。
// 工厂模式
function createBook(name,time,type) {
// 创建一个对象,并对对象扩展属性和方法
var o = new Object();
o.name = name;
o.time = time;
o.type = type;
o.getName = function() {
console.log(this.name)
}
// 将对象返回
return o;
}
var book1 = createBook('js book','2004','js');
var book2 = createBook('java book','2005','java');
book1.getName(); // js book
book2.getName(); // java book
我们对上面三个弹框类进行优化:
function createPop(type,text) {
// 创建一个对象,并对对象扩展属性和方法
var o = new Object();
o.content = text;
o.show = function() {
// 显示方法
}
if(type == 'alert') {
// 警示框差异部分
}
if(type == 'prompt') {
// 提示框差异部分
}
if(type == 'confirm') {
// 确认框差异部分
}
// 将对象返回
return o;
}
// 创建警示框
var userNameAlert = createPop('alert','用户名只能是26个字母或数字');
你的理解决定你的选择方式
第一种是通过类实例化对象创建的,第二种是通过创建新的对象然后包装增强其属性和功能来实现的。
【JS设计模式笔记】神奇的魔术师-简单工厂模式(创建型)的更多相关文章
- 设计模式(四):SIMPLE FACTORY简单工厂模式 -- 创建型模式
1.定义 简单工厂模式又称静态工厂方法模式.重命名上就可以看出这个模式一定很简单.它存在的目的很简单:定义一个用于创建对象的接口. 2.适用场景 如果一个客户要一款宝马车,一般的做法是客户去创建一款宝 ...
- 设计模式(3)--SimpleFactory( [1] 简单工厂模式)--创建型
1.模式定义: 简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 2.模式特点: 实现方式的 ...
- 设计模式(三): FACTORY工厂模式 -- 创建型模式
1.定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类. 2.适用场景 1.第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体 ...
- 学习设计模式第二十七 - GoF之外简单工厂模式
示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...
- [Python设计模式] 第1章 计算器——简单工厂模式
github地址:https://github.com/cheesezh/python_design_patterns 写在前面的话 """ 读书的时候上过<设计模 ...
- Java 设计模式系列(二)简单工厂模式和工厂方法模式
Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...
- Javascript设计模式理论与实战:简单工厂模式
通常我们创建对象最常规的方法就是使用new关键字调用构造函数,这会导致对象之间的依赖性.工厂模式是一种有助于消除类之间依赖性的设计模式,它使用一个方法来决定要实例化哪一个类.本文详细介绍了简单工厂模式 ...
- 设计模式(C#)——02简单工厂模式
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来.通俗来说,你只关心怎么用,不用关心怎么做 ...
- 设计模式(Java语言)- 简单工厂模式
简单工厂模式有称为静态工厂模式,属于设计模式中的创建型模式.简单工厂模式通过对外提供一个静态方法来统一为类创建实例.简单工厂模式的目的是实现类与类之间解耦,其次是客户端不需要知道这个对象是如何被穿创建 ...
- 设计模式(二)——Java简单工厂模式
简单工厂模式 案例: 披萨的项目(要便于披萨种类的扩展,要便于维护) 1)披萨的种类很多(比如 GreekPizz.CheesePizz 等) 2)披萨的制作有 prepare,bake, cut, ...
随机推荐
- mybatis-plus的insert方法出现-id' doesn't have a default value问题
出现这个问题,只需把对应的字段注解设置为,例如: @TableId(value = "id",type = IdType.INPUT) private String id; 即可解 ...
- P2918
[USACO08NOV]Buying Hay S 题意描述 约翰的干草库存已经告罄,他打算为奶牛们采购 H(1 \leq H \leq 50000)H(1≤H≤50000) 磅干草. 他知道 N(1 ...
- Solo 开发者周刊 (第3期):如何打造令人惊艳的AI体验
这里会整合 Solo 社区每周推广内容.产品模块或活动投稿,每周五发布.在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解.本杂志开源,欢迎投稿. 好文推荐 Plu ...
- 1. C++ 开发环境
C++ 开发环境 Visual C++ / GCC(G++) / Clang(Clang++) 集成开发环境:Visual Studio / CodeLite / Code::blocks / CLi ...
- oeasy教您玩转vim - 40 - # 复制粘贴
复制粘贴 回忆上节课内容 我们上次的内容是粘贴 小写p意味着在光标下面或者后面粘贴 大写P意味着在光标上面或者前面粘贴 p的意思是放上去,就是put 把什么放上去呢? 把 reg 中 " ...
- 记录一次在欧拉(openEuler22.03LTS-SP4)系统下安装(踩坑)Freeswitch1.10.11的全过程
目录 前言 安装环境 1. 下载Freeswitch 1.1 git clone 下载freeswitch库 1.2 官网下载 2. 开始安装前的工作 2.1 安装编译时需要的环境[先安装这个!] 2 ...
- JuiceFS 直连 NFS 新功能介绍,赋能 NAS 进行 AI 训练
NAS 通过提供多用户网络数据存取服务,极大地简化了数据共享和管理.而 NFS 作为实现这种共享的一种主流协议,尽管广泛应用,但在处理复杂的 AI 训练场景时常常受限于其性能和一致性问题. Juice ...
- 安装docker并部署java项目
docker部署springboot项目(详细教程)_使用docker部署springboot项目_流星007的博客-CSDN博客 ps:以下是部署到linux 服务器中的 案例(与chatgpt的对 ...
- Linux 有趣命令
代码雨 1.上传软件包 Linux 获取 wget https://jaist.dl.sourceforge.net/project/cmatrix/cmatrix/1.2a/cmatrix-1.2a ...
- Jmeter函数助手25-log
log函数用于记录一条日志并返回其值. String to be logged (and returned):函数会返回该值.控制台也能看到该字符 Log level (default INFO) o ...