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实现可自定义大小,可双击关闭的弹出层效果
Oct 16 Javascript
深入学习jQuery Validate表单验证(二)
Jan 18 Javascript
JS判断元素是否在数组内的实现代码
Mar 30 Javascript
好好了解一下Cookie(强烈推荐)
Jun 14 Javascript
jQuery弹出层插件popShow用法示例
Jan 23 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
May 18 Javascript
jQuery开源组件BootstrapValidator使用详解
Jun 29 jQuery
对于js垃圾回收机制的理解
Sep 14 Javascript
Angular(5.2->6.1)升级小结
Dec 27 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
Apr 11 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
Nov 21 Javascript
node.js通过Sequelize 连接MySQL的方法
Dec 28 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
Zerg建筑一览
2020/03/14 星际争霸
php面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
PHP 截取字符串专题集合
2010/08/19 PHP
PHP程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
PHP中source #N问题的解决方法
2014/01/27 PHP
Ubuntu 16.04下安装PHP 7过程详解
2017/03/28 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
简略的前端架构心得&&基于editor为例子的编码小技巧
2010/11/25 Javascript
使用jquery读取html5 localstorage的值的方法
2013/01/04 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
2014/07/15 NodeJs
JS获取鼠标选中的文字
2016/08/10 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
详解js创建对象的几种方法及继承
2019/04/12 Javascript
jQuery 实现扁平式小清新导航
2020/07/07 jQuery
jQuery实现简单三级联动效果
2020/09/05 jQuery
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
Linux下python与C++使用dlib实现人脸检测
2018/06/29 Python
Django rest framework工具包简单用法示例
2018/07/20 Python
Python如何读写二进制数组数据
2020/08/01 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
CSS3实现苹果手机解锁的字体闪亮效果示例
2021/01/05 HTML / CSS
Oracle中delete,truncate和drop的区别
2016/05/05 面试题
职业教育毕业生求职信
2013/11/09 职场文书
优秀学生获奖感言
2014/02/15 职场文书
优秀的应届生自荐信
2014/05/23 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
婚宴新郎致辞
2015/07/28 职场文书
Python答题卡识别并给出分数的实现代码
2021/06/22 Python
分享Python获取本机IP地址的几种方法
2022/03/17 Python