JavaScript设计模式之工厂方法模式介绍


Posted in Javascript onDecember 28, 2014

1. 简单工厂模式

说明:就是创建一个工厂类,里面实现了所对同一个接口的实现类的创建。

但是好像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>. 创建一个工厂类:

function SendFactory() {

    this.sender = null;

}
SendFactory.prototype.produce = function(type) {

    var me = this;

    if (type == 'mail') {

        me.sender = new MailSender();

    } else if (type == 'sms') {

        me.sender = new SmsSender();

    }

 return me.sender;

}

4>. 使用这个工厂类:

var factory = new SendFactory();

var sender = factory.produce('mail'); //sms

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

sender.title = '邮件测试标题!';

sender.content = '发送内容';

sender.send();

2. 多个工厂方法模式

说明:多个工厂模式方法,是对普通工厂方法的改进,因为返回实现是依据传进去的字符返回,当字符输入错误,可能就无法处理,或是处理成错误的方式; 而多个工厂模式方法,就可以避免这样的错误;

我们对上面的工厂类进行改进:

function SendFactory() {

    this.sender = null;

}
SendFactory.prototype.produceMail = function() {

    var me = this;

    me.sender = new MailSender();

    return me.sender;

}
SendFactory.prototype.produceSms = function() {

    var me = this;

    me.sender = new SmsSender();

    return me.sender;

}

使用方法:

var factory = new SendFactory();

var sender = factory.produceSms(); //produceMail

sender.to = 'toName#xxxxx';

sender.title = '短信发送方法标题';

sender.content = '发送内容';

sender.send();

3. 静态工厂方法模式

说明:将上面的 多个工厂方法模式 的方法改为静态标识即可,使之不必对 SendFactory 进行实例化;

将工厂类代码修改如下:

var SendFactory = {

    produceMail : function() {

        return new MailSender();

    },

    produceSms : function() {

        return new SmsSender();

    }

}

使用方法:

var sender = SendFactory.produceMail();

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

sender.title = '邮件发送标题';

sender.content = '发送内容';

sender.send();

工厂方法模式说明

在面向对象思想编程说明,在具有很多产品(现实世界模型,名称:类名,成员属性,及操作方法等)需要初始化,即产品需要创建,并且[实现同一接口时],可以使用工厂方法模式; 第一种模式,有输入类型错误的可能,第二模式,需要用时即创建工厂实例;

Javascript 相关文章推荐
js删除所有的cookie的代码
Nov 25 Javascript
基于JQuery的动态删除Table表格的行和列的代码
May 12 Javascript
javascript 上下banner替换具体实现
Nov 14 Javascript
跨域资源共享 CORS 详解
Apr 26 Javascript
Angular2学习教程之ng中变更检测问题详解
May 28 Javascript
Vuejs 页面的区域化与组件封装的实现
Sep 11 Javascript
vue组件间的参数传递实例详解
Apr 26 Javascript
vue+element 模态框表格形式的可编辑表单实现
Jun 07 Javascript
浅谈一种让小程序支持JSX语法的新思路
Jun 16 Javascript
vue实现在线翻译功能
Sep 27 Javascript
如何解决vue在ios微信"复制链接"功能问题
Mar 26 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
Aug 10 Javascript
JavaScript设计模式之抽象工厂模式介绍
Dec 28 #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
You might like
PHP中FTP相关函数小结
2016/07/15 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
node.js中的console.time方法使用说明
2014/12/09 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
2016/08/29 Javascript
Javascript获取图片原始宽度和高度的方法详解
2016/09/20 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
JS浮点数运算结果不精确的Bug解决
2019/08/01 Javascript
vue实现移动端触屏拖拽功能
2020/08/21 Javascript
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
python实现井字棋游戏
2020/03/30 Python
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
浅谈python中对于json写入txt文件的编码问题
2018/06/07 Python
Python 实用技巧之利用Shell通配符做字符串匹配
2019/08/23 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
HTML5 LocalStorage 本地存储详细概括(多图)
2017/08/18 HTML / CSS
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
初中家长寄语
2014/04/02 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
2015年办公室个人工作总结
2015/04/20 职场文书