这里主要介绍两种工厂模式,第一种“简单工厂模式”,第二种“工厂方法模式”

简单工厂模式

1.定义

由一个工厂对象决定对象创建某一种产品对象的的实例。主要用来创建同一类对象。

2.具体需求

现在有一个登录模块,当用户的输入的用户名多于16个时,给一个警示弹窗

var LoginAlert = function(text) {
this.content = text
} LoginAlert.prototype.show = function() {
//显示警示框
}
var userNameAlert = new LoginAlert('用户名不能多于16个字母或数字')
userNameAlert.show()

当用户输入的密码不正确时,给一个密码不正确的弹窗,心中暗喜,面对对象编程真好用,刚刚学完的类就能派上用场

var passwordAlert = new LoginAlert('输入的密码啊不正确')
passwordAlert.show();

新需求:当用户登录时用户名不存在的时候弹窗提示“您的用户名不存在,请重新输入”,并在警示框上加一个注册按钮,完了,之前的累无法复用,又得创建一个类

var LoginConfirm = function(text) {
this.content = text
} LoginConfirm.prototype.show = function() {
//显示确认框
}
var loginFailConfrim = new LoginConfirm('您的用户名不存在,请重新输入')
loginFailConfrim.show()

新需求:当用户登录成功的时候给一个弹窗,除了有确认按钮和取消按钮,也提示一句‘欢迎回来,请输入您的心情’,这又得写一个新类

var LoginPrompt = function(text) {
this.content = text
} LoginPrompt.prototype.show = function() {
//显示确认框
}

新需求:现在有注册模块也要做,也有这些需求,这时候我们应该怎么办呢?

我们这个把这三个类封装在一个函数里,这时候我们只需要记住这个函数,然后通过这个函数就可以创建我们需要的对象,这样所有使用的人都不在关注这些对象到底依赖于哪些基类,我们知道这个函数就可以。这个函数我们通常也称为工厂函数,这种模式叫简单工厂模式,是工厂模式中最简单的一种形式

如何改造:

var PopFactory = function(name) {
switch(name) {
case 'alert':
return new LoginAlert();
case 'confirm':
return new LoginConfirm();
case 'prompt':
return new LoginPrompt();
}
}

这样我们就实现了一个简单的工厂,使用者只要知道这个工厂和参数就行,但是这3个类用很多公有的方法,能不能提取出来?

现在我们把这三个类改成一个工厂模式,首先抽象他们的相同点,不如共有属性this.content,原型共有方法show,当然也有不同点,比如确认框和提示框的确定按钮,提示框的用户输入等等

function createPop(type, text) {
var o = new Object();
o.content = text;
o.show = function() {
//显示方法
}
if (type == 'alert') { }
if (type == 'prompt') { }
if (type == 'confirm') { }
}
//创建警示框
var userNameAlert = createPop('alert', '用户名只能是26个字母和数字')

总结:团队开发不同于个人开发,其对全局变量限制很大,所以我们要尽量少的创建全局变量。对于同一类对象在不同需求中的重复性使用,很多时候不需要重复创建,代码复用是面向对象的一条准则

2.工厂方法模式

定义

通过对产品类的抽象使其创造业务只要负责用户创建多类产品的实例

具体需求

网站首页要展示一个大批学科,字体和颜色不一

var Java = function(content) {
this.content = content
(function() {
var div = document.createElement('div')
div.innerHtml = content;
div.style.color = 'green';
dicument.getElementById('container').appendChild('div')
})(content)
} var Php = function(content) {
//....
}

上节课学过的简单工厂模式派上了用场,赶紧去用简单的工厂模式去实现一下,这样以后再创建对象直接找工厂就行

var Java = function(content) {
this.content = content
(function() {
var div = document.createElement('div')
div.innerHtml = content;
div.style.color = 'green';
dicument.getElementById('container').appendChild('div')
})(content)
} var Php = function(content) {
//....
} var JavaScript = function(content) {
//...
} function JobFactory(type, content) {
switch(type) {
case: 'java':
return new Java(content)
case: 'php':
return new Php(content)
case: 'javascript':
return new JavaScript(content)
}
}

新需求:现在又需要加一批UI学科,红色边框。

问题:需求一直在变,开始需求简单,直接创建对象,后来需求多了,用简单方法工厂方法重构,现在又变了,不仅仅要添加类,还要修改工厂函数,很麻烦,现在引入我们的工厂方法来解决这个问题

Factory.prototype = {
Java:function(content) {
//...
},
JavaSctipt:function(content) {
//...
},
Java: function(content) {
//...
}
}

这样我们如果要添加其他的类,只需要写在Factory这个工程类里面就行了

安全的工厂方法

安全的工厂方法是可以屏蔽一些使用过程中造成的错误,我们知道类前面不要有new的关键字,不过如果其他人不知道这个对象是一个雷,忽略了new关键字直接执行,此时得不到我们预期的对象,解决办法如下

var Factory = function(type, content) {
if (this instanceof Factory) {
var s = new this[type](content)
return s
} else {
return new Factory(type, content)
}
}
Factory.prototype = {
Java:function(content) {
//...
},
JavaSctipt:function(content) {
//...
},
Java: function(content) {
//...
}
}

Javascript工厂模式介绍到此结束,有不对的地方请及时指出

浅析JavaScript工厂模式的更多相关文章

  1. javascript工厂模式和构造函数模式创建对象

    一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...

  2. javascript工厂模式

    工厂模式 设计工厂模式的目的是为了创建对象.它通常在类或者类的静态方法实现,具有下列目标: 1.在创建相似对象是执行重复操作 2.在编译时不知道具体类型(类)的情况下,为工厂客户提供一种创建对象的接口 ...

  3. javascript工厂模式、单例模式

    //工厂模式 function createObject(name,age){ var obj = new Object(); obj.name = name; obj.age = age; obj. ...

  4. JavaScript 工厂模式和订阅模式

    设计模式的好处: 代码规范 // 例如表单验证,两个 input ,一个用户名,一个密码 // 通常做法是 function checkUser(){ //..... } function check ...

  5. JavaScript 工厂模式

    //工厂 function FruitMaker() { //function 后不带方法名,这里cococola未定义,make return时,返回 FruitMaker.cococola thi ...

  6. JavaScript工厂模式代码

    function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayNam ...

  7. js工厂模式和构造函数

    <!DOCTYPE html><html><head> <title>工厂模式和构造函数</title> <meta charset ...

  8. javascript 设计模式-----工厂模式

    所谓的工厂模式,顾名思义就是成批量地生产模式.它的核心作用也是和现实中的工厂一样利用重复的代码最大化地产生效益.在javascript中,它常常用来生产许许多多相同的实例对象,在代码上做到最大的利用. ...

  9. javascript模式 (3)——工厂模式和装饰模式

    上节我们讲解了单例模式,这节我们将继续讲解工厂模式和迭代器模式 工厂模式: 工厂模式的目的是为了方便的创建对象(可以在不知道构造的情况下),通过静态方法来实现,在java或c#等静态编译语言中需要通过 ...

随机推荐

  1. CloseableHttpClient获取https请求不验证证书

    创建---调用 CloseableHttpClient httpclient = getHttpsClient(); /** * 获取https连接(不验证证书) * * @return */ pri ...

  2. [Python]CentOS - ImportError: No module named '_curses'

    网上搜了不少答案, 基本都是说Windows环境下curses包不适用的问题. 作为碰到这个问题的linux用户,实在感到无奈. 起因是在CentOS上部署uwsgi,想要使用uwsgitop来监控. ...

  3. 我的 FPGA 学习历程(14)—— PWM 脉冲宽度调制

    PWM 是一种调节输出功率的技术(俗称调压),其原理在于改变输出方波的占空比,具体输出见下图: 输出信号为电压值,当负载为恒阻时,上图中的输出功率分别为 25%.50%.75%. 实现方法如下: 设置 ...

  4. 微信跳转技术,浏览器唤起微信,weixin://dl/business/?ticket=

    weixin://dl/business/?ticket=  到底怎么生成的?调用以下接口 weixin://dl/scan 扫一扫weixin://dl/feedback 反馈weixin://dl ...

  5. Linux结束进程到底有多少种方法?

    我们经常在Linux里使用kill命令来结束某后台进程.但kill命令实际上是向进程发送信号,并且有多种信号.终止运行一个程序只是其中一个信号而已.kill是根据进程号发送信号的,而另一个工具kill ...

  6. vue基于webpack说明

    1.文件build里的check-versions.js:检查node和npm版本, 此文件里的 (1)require('chalk')引入一个模块,定义输入终端样式 (2) require('sem ...

  7. ajax源代码

    //**********第一步, 获得一个xhr对象************* var xmlHttpReq = null; //声明一个空对象用来装入XMLHttpRequest if (windo ...

  8. java课程之团队开发冲刺阶段1.7

    一.总结昨天进度 1.昨天学习了对数据库增删改查的基本操作,并且可以使用代码实现操作 二.遇到的问题 1.由于是学习阶段,没有遇到太大阻碍,但是最终需要实现的是联网进行数据库的读写或者是对本地数据库的 ...

  9. HelloPython

    HELLOWORD!你好!Python! 学习Python已有一段时间,一个人自学颇不容易,在此分享一些自己学习经验和感受,温故而知新,也希望自己能有些新收获. 学习Python,大多数人创建的第一个 ...

  10. 关于 js中replace 特殊符号 ‘.’ 的问题

    问题: 字符串转数组,但是分割点在‘.’ ,需要保留每个后缀的 ‘.’ + 类型 解决: let videoType = '.avi.rmvb.rm.asf.divx.mpg.mpeg.mpe.wmv ...