【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, ...
随机推荐
- 有向图_节点间路径路径--python数据结构
字典创建有向图,查找图节点之间的路径,最短路径,所有路径 """ 参考文档: https://www.python.org/doc/essays/graphs/ &quo ...
- 修改PE文件来实现管理员权限
在Windows我们常用的方法就是给应用添加app.manifest清单文件,然后生成的Exe就会具有管理员权限. 近期我在使用Wix制作Exe安装包时,发现此方法不通,我在github上和Stack ...
- fragment的查找和移除
FragmentManager fragmentmanger = getSupportFragmentManager(); FragmentTransaction fragmenttransactio ...
- 我用Awesome-Graphs看论文:解读PowerGraph
PowerGraph论文:<PowerGraph: Distributed Graph-Parallel Computation on Natural Graphs> 上次通过文章< ...
- 如何自动实现本地AD中禁用的用户从地址列表中隐藏掉?
我的博客园:https://www.cnblogs.com/CQman/ 如何自动实现本地AD中禁用的用户从地址列表中隐藏掉? 需求信息: 用户本地AD用户通过ADConnect同步到O365,用户想 ...
- 对比python学julia(第一章)--(第三节)山巅一寺一壶酒
在小学阶段背过圆周率的同学对这节的标题应该不陌生.π(3.14159-)是大家熟悉的普通无理数,但也是非常神秘的一组数字,例如几个世纪以来,埃及考古学家和神秘主义追随者一直痴迷于胡夫金字塔暗藏的圆周率 ...
- 【Tutorial C】08 函数 Function
函数的定义 C源程序是由函数组成的. 最简单的程序有一个主函数 main(),但实用程序往往由多个函数组成, 由主函数调用其他函数,其他函数也可以互相调用. 函数是C源程序的基本模块,程序的许多功能是 ...
- 失温急救处理方法——1.快速复温;2.心肺复苏;3.口服或静脉注射生理盐水(40 ~ 42 ℃ ,小剂量250 mL);4.口服或静脉注射抗血栓药物,如布洛芬
相关: https://haokan.baidu.com/v?pd=wisenatural&vid=14530104659934311010 参考: https://m.bjnews.com. ...
- 【转载】逐际动力双足机器人P1在深圳塘朗山零样本、无保护、全开放完成测试
原文: https://weibo.com/1255595687/O5k4Aj8l2 [逐际动力双足机器人P1在深圳塘朗山零样本.无保护.全开放完成测试] 上周,就在全球AI界被美国初创公司Figur ...
- 一个域名可以对应多个IP吗,一个IP可以对应多个域名吗?
本文谈两个问题:一个域名可以对应多个IP吗,一个IP可以对应多个域名吗? 问题1:一个IP可以对应多个域名吗? 因为域名都是由各个域名供应商提供的,我们可以在不同的域名供应商那里买不同的域名,然后把这 ...