javascript抽象工厂模式详细说明


Posted in Javascript onDecember 16, 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 相关文章推荐
jQuery示例收集
Nov 05 Javascript
浅析Prototype的模板类 Template
Dec 07 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
Oct 20 Javascript
JavaScript中判断函数、变量是否存在
Jun 10 Javascript
jQuery+HTML5实现图片上传前预览效果
Aug 20 Javascript
JS实现上下左右对称的九九乘法表
Feb 22 Javascript
原生JS取代一些JQuery方法的简单实现
Sep 20 Javascript
vue中vee validate表单校验的几种基本使用
Jun 25 Javascript
js中call()和apply()改变指针问题的讲解
Jan 17 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
Jan 30 Javascript
koa router 多文件引入的方法示例
May 22 Javascript
vue element自定义表单验证请求后端接口验证
Dec 11 Javascript
node.js中的fs.statSync方法使用说明
Dec 16 #Javascript
node.js中的fs.stat方法使用说明
Dec 16 #Javascript
node.js中的fs.realpathSync方法使用说明
Dec 16 #Javascript
node.js中的fs.realpath方法使用说明
Dec 16 #Javascript
node.js中的fs.renameSync方法使用说明
Dec 16 #Javascript
node.js中的fs.rename方法使用说明
Dec 16 #Javascript
关于Javascript加载执行优化的研究报告
Dec 16 #Javascript
You might like
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
基于simple_html_dom的使用小结
2013/07/01 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
必须收藏的php实用代码片段
2016/02/02 PHP
php面向对象值单例模式
2016/05/03 PHP
js post方式传递提交的实现代码
2010/05/31 Javascript
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
实例详解JSON取值(key是中文或者数字)方式
2017/08/24 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
bootstrap table支持高度百分比的实例代码
2018/02/28 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
详解iview的checkbox多选框全选时校验问题
2019/06/10 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
使用node.JS中的url模块解析URL信息
2020/02/06 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
[01:00:25]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS Liquid
2018/03/31 DOTA
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
使用python和pygame绘制繁花曲线的方法
2018/02/24 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
python 实现图片裁剪小工具
2021/02/02 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
置业顾问岗位职责
2014/03/02 职场文书
党员检讨书
2014/10/13 职场文书
管辖权异议上诉状
2015/05/23 职场文书
七年级作文之冬景
2019/11/07 职场文书
python 判断字符串当中是否包含字符(str.contain)
2022/06/01 Python