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 相关文章推荐
学习YUI.Ext 第二天
Mar 10 Javascript
使用javascript获取flash加载的百分比的实现代码
May 25 Javascript
Textarea与懒惰渲染实现代码
Jan 04 Javascript
jquery中one()方法的用法实例
Jan 16 Javascript
AngularJS的表单使用详解
Jun 17 Javascript
js 将图片连接转换成base64格式的简单实例
Aug 10 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
Oct 28 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
Dec 03 Javascript
详解Eslint 配置及规则说明
Sep 10 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
Oct 22 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
Apr 17 Javascript
如何通过简单的代码描述Angular父组件、子组件传值
Apr 07 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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
无数据库的详细域名查询程序PHP版(2)
2006/10/09 PHP
无数据库的详细域名查询程序PHP版(1)
2006/10/09 PHP
php抓即时股票信息
2006/10/09 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
Javascript表达式中连续的 && 和 || 之赋值区别
2010/10/17 Javascript
推荐20家国外的脚本下载网站
2011/04/28 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
2016/03/23 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
原生JS:Date对象全面解析
2016/09/06 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
js实现前面自动补全位数的方法
2018/10/10 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
python实现二分类和多分类的ROC曲线教程
2020/06/15 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
消防安全检查制度
2014/02/04 职场文书
工作过失检讨书
2014/02/23 职场文书
求职自荐信的格式
2014/04/07 职场文书
工作表扬信范文
2015/01/17 职场文书
教师个人年终总结
2015/02/11 职场文书
借条格式范本
2015/05/25 职场文书
MySQL RC事务隔离的实现
2022/03/31 MySQL