JavaScript设计模式之抽象工厂模式介绍


Posted in Javascript onDecember 28, 2014

抽象工厂模式说明

1. 工厂方法模式的问题: 在工厂方法模式里,创建类都需要通过 工厂类,如果要扩展程序,就必须修改工厂类,这违背了闭包原则,对扩展开放,对修改关闭;对于设计有一定的问题。
2. 如何解决:就要用到抽象工厂模式,就是对功能类单独创建工厂类,这样就不必修改之前的代码,又扩展了功能。
3. 工厂模式其实就是对 实现同一接口的 实现类 的 统一 工厂方式创建调用,但 javascript 没有接口这号东西,所以就去掉这一层 实现,但位功能类的成员及方法都应当一样;

抽象工厂源码例子

1. 邮件发送类:

function MailSender() {

    this.to = '';

    this.title = '';

    this.content = '';

}
MailSender.prototype.send = function() {

    //send body

}

2. 短信发送类:

function SmsSender() {

    this.to = '';

    this.title = '';

    this.content = '';

}
SmsSender.prototype.send = function() {

    //send body

}

3. 这里本来是创建工厂接口类,这里就去掉了; 直接创建各功能类工厂;

1>. 邮件工厂类:

function MailFactory() {

    

}

MailFactory.prototype.produce = function() {

    return new MailSender();

}

2>. 短信工厂类:

function SmsFactory() {

    

}

SmsFactory.prototype.produce = function() {

    return new SmsSender();

}

4. 使用方法:

var factory = new MailFactory();

var sender = factory.produce();

sender.to = 'toname#mail.com';

sender.title = '抽象工厂模式';

sender.content = '发送内容';

sender.send();

其他说明

在面向对象语言如 java,.net C# 使用的工厂模式,都用到接口,接口是对外向各种用户暴露的可用方法,说明这个功能应用有些什么的方法应用,用户应该怎么用这个接口。对象以类的形式表现出来,代表现实世界中的某种抽象,也许场景会有很多类似的应用,比如上面的 邮件发送,短信发送,再比如商场中的各种促销手段,以及动物世界中的各种飞禽走兽等..

如果我们不以接口形式提供用户使用,势必提供暴露真实的功能类对象给用户,用户可以随意对类对象进行修改跟扩展,这是不允许的。

工厂方法模式 跟 抽象工厂模式可以很好的解决这样的问题,用户只能使用接口调用工厂类,来进行规定的操作;抽象工厂模式更进一步使用扩展功能变得容易,功能类跟工厂类都在实现相应的接口上实现各自类级别的扩展,不会涉及修改到其他的类或方法;

当然 javascript 这种语言,没办法这么干,程序员得自律!

Javascript 相关文章推荐
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
Oct 16 Javascript
jQuery中unwrap()方法用法实例
Jan 16 Javascript
javascript实现可拖动变色并关闭层窗口实例
May 15 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
Aug 31 Javascript
Bootstrap框架下下拉框select搜索功能
Mar 26 Javascript
js防阻塞加载的实现方法
Sep 09 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
Mar 13 Javascript
jQuery中的deferred对象和extend方法详解
May 08 jQuery
基于bootstrap写的一点localStorage本地储存
Nov 21 Javascript
webpack-dev-server自动更新页面方法
Feb 22 Javascript
对vue中v-if的常见使用方法详解
Sep 28 Javascript
vue使用高德地图根据坐标定位点的实现代码
Aug 22 Javascript
JavaScript设计模式之单件模式介绍
Dec 28 #Javascript
理解javascript回调函数
Dec 28 #Javascript
JavaScript设计模式之建造者模式介绍
Dec 28 #Javascript
如何编写高质量JS代码
Dec 28 #Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
Dec 28 #Javascript
javascript中定义类的方法汇总
Dec 28 #Javascript
js数组的操作指南
Dec 28 #Javascript
You might like
php生成图片验证码-附五种验证码
2015/08/19 PHP
window.location和document.location的区别分析
2008/12/23 Javascript
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
return false;和e.preventDefault();的区别
2010/07/11 Javascript
js操作CheckBoxList实现全选/反选(在客服端完成)
2013/02/02 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
实用jquery操作表单元素的简单代码
2016/07/04 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
js前端导出Excel的方法
2017/11/01 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
vue单页面实现当前页面刷新或跳转时提示保存
2018/11/02 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
详解使用mocha对webpack打包的项目进行"冒烟测试"的大致流程
2020/04/27 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
[01:00:44]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第三局
2016/03/04 DOTA
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
Python实现递归遍历文件夹并删除文件
2016/04/18 Python
Python登录注册验证功能实现
2018/06/18 Python
python 表格打印代码实例解析
2019/10/12 Python
使用python实现名片管理系统
2020/06/18 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
P/Invoke是什么
2015/07/31 面试题
小学生倡议书范文
2014/05/13 职场文书
交通安全教育主题班会
2015/08/12 职场文书
写自招自荐信的绝招!
2019/04/19 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python
JDBC连接的六步实例代码(与mysql连接)
2021/05/12 MySQL
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python