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 相关文章推荐
翻译整理的jQuery使用查询手册
Mar 07 Javascript
原型方法的不同写法居然会影响调试的解决方法
Mar 08 Javascript
js优化针对IE6.0起作用(详细整理)
Dec 25 Javascript
jquery高级编程的最佳实践详解
Mar 23 Javascript
node.js中的console.assert方法使用说明
Dec 10 Javascript
关于Javascript回调函数的一个妙用
Aug 29 Javascript
js仿网易表单及时验证功能
Mar 07 Javascript
jQuery查找dom的几种方法效率详解
May 17 jQuery
vue发送websocket请求和http post请求的实例代码
Jul 11 Javascript
JS面向对象之单选框实现
Jan 17 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
Oct 22 Javascript
如何用JS实现简单的数据监听
May 06 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源代码数组统计count分析
2011/08/02 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
PHP简单预防sql注入的方法
2016/09/27 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
TextArea 控件的最大长度问题(js json)
2009/12/16 Javascript
原生js实现图片层叠轮播切换效果
2016/02/02 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
初探nodeJS
2017/01/24 NodeJs
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
微信小程序 自定义复选框实现代码实例
2019/09/04 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
Vue-cli打包后如何本地查看的操作
2020/09/02 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
Python中的闭包详细介绍和实例
2014/11/21 Python
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
利用pyinstaller或virtualenv将python程序打包详解
2017/03/22 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
2018/12/19 Python
Pycharm保存不能自动同步到远程服务器的解决方法
2019/06/27 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
在pycharm中实现删除bookmark
2020/02/14 Python
Python数组并集交集补集代码实例
2020/02/18 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
Django values()和value_list()的使用
2020/03/31 Python
Django DRF路由与扩展功能的实现
2020/06/03 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
北京华建集团SQL面试题
2014/06/03 面试题
How to spawning asynchronous work in J2EE
2016/08/29 面试题
迟到检讨书400字
2014/01/13 职场文书
2014社区三八妇女节活动总结
2014/03/01 职场文书
失恋33天观后感
2015/06/11 职场文书
教你使用Jenkins集成Harbor自动发布镜像
2022/04/03 Servers