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 相关文章推荐
ExtJS下 Ext.Direct加载和提交过程排错小结
Apr 02 Javascript
javascript为下拉列表动态添加数据项
May 23 Javascript
javascript将异步校验表单改写为同步表单
Jan 27 Javascript
Javascript优化技巧之短路表达式详细介绍
Mar 27 Javascript
JQuery调用绑定click事件的3种写法
Mar 28 Javascript
jquery ajax 如何向jsp提交表单数据
Aug 23 Javascript
Angularjs全局变量被作用域监听的正确姿势
Feb 06 Javascript
简单实现node.js图片上传
Dec 18 Javascript
ionic2 tabs 图标自定义实例
Mar 08 Javascript
Vue添加请求拦截器及vue-resource 拦截器使用
Nov 23 Javascript
vue 实现类似淘宝星级评分的示例
Mar 01 Javascript
记录一次websocket封装的过程
Nov 23 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中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
PHP实现生成透明背景的PNG缩略图函数分享
2014/07/08 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
页面中iframe相互传值传参
2009/12/13 Javascript
锋利的jQuery 第三章章节总结的例子
2010/03/23 Javascript
加速IE的Javascript document输出的方法
2010/12/02 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
JS,Jquery获取select,dropdownlist,checkbox下拉列表框的值(示例代码)
2014/01/11 Javascript
js跨域访问示例(客户端/服务端)
2014/05/19 Javascript
一道关于JavaScript变量作用域的面试题
2016/03/08 Javascript
浅谈Angular路由复用策略
2017/10/04 Javascript
vue.js实现点击后动态添加class及删除同级class的实现代码
2018/04/04 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
JavaScript中的事件与异常捕获详析
2019/02/24 Javascript
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
在小程序中推送模板消息的实现方法
2019/07/22 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
vue开发中遇到的问题总结
2020/04/07 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
python调用windows api锁定计算机示例
2014/04/17 Python
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
python刷投票的脚本实现代码
2014/11/08 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
python每天定时运行某程序代码
2019/08/16 Python
python实现文件批量编码转换及注意事项
2019/10/14 Python
基于Pycharm加载多个项目过程图解
2020/01/19 Python
45个非常奇妙的CSS3 特性应用示例
2012/01/01 HTML / CSS
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
中专毕业生的自我鉴定
2013/12/01 职场文书
校园公益广告语
2014/03/13 职场文书
关于读书的演讲稿1000字
2014/08/27 职场文书
临时工聘用合同协议书
2014/10/29 职场文书
修改MySQL的默认密码的四种小方法
2021/05/26 MySQL
python之PySide2安装使用及QT Designer UI设计案例教程
2021/07/26 Python
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL