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 相关文章推荐
Javascript 模式实例 观察者模式
Oct 24 Javascript
window.location不跳转的问题解决方法
Apr 17 Javascript
javascript显式类型转换实例分析
Apr 25 Javascript
BootStrap 图片样式、辅助类样式和CSS组件的实例详解
Jan 20 Javascript
JavaScript实现图片切换效果
Aug 12 Javascript
vue项目常用组件和框架结构介绍
Dec 24 Javascript
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
Jan 25 jQuery
微信小程序开发之路由切换页面重定向问题
Sep 18 Javascript
react配置antd按需加载的使用
Feb 11 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
Mar 29 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
Apr 04 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
Nov 20 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
中英文字符串翻转函数
2008/12/09 PHP
elgg 获取文件图标地址的方法
2010/03/20 PHP
php数据入库前清理 注意php intval与mysql的int取值范围不同
2010/12/12 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
解析thinkphp的左右值无限分类
2013/06/20 PHP
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
php递归删除指定文件夹的方法小结
2015/04/20 PHP
浅谈PHP的反射API
2017/02/26 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
IE下js调试工具Companion.JS
2010/10/15 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
js单例模式的两种方案
2013/10/22 Javascript
js检测用户输入密码强度
2015/10/22 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
使用js获取伪元素的content实例
2017/10/24 Javascript
利用JavaScript的%做隔行换色的实例
2017/11/25 Javascript
尝试自己动手用react来写一个分页组件(小结)
2018/02/09 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
Three.js实现3D机房效果
2018/12/30 Javascript
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
Python去除列表中重复元素的方法
2015/03/20 Python
Python网站验证码识别
2016/01/25 Python
Flask-WTF表单的使用方法
2019/07/12 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
python爬虫判断招聘信息是否存在的实例代码
2020/11/20 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
高三语文教学反思
2014/01/15 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript