【Javascript设计模式】第三课 工厂方法模式
在项目开发中经常遇到在网页上显示一些相同的样式但是内容不同的需求,而且这个需求还是动态的,随着需求的变化内容也有可能在不断的变化,对此我们推荐:工厂模式:通过对产品类的抽象使其创建业务主要用于创建多类产品的实例。
比如说有个需求,需要做两个广告,这样我们可以直接定义两个类来实现
var Java = function (content) {
//将内容备份到content中,以备日后使用
this.content = content;
//创建对象时,通过闭包直接执行,讲内容按照需求的模式插入到页面
(function () {
var div = document.createElement('div');
div.innerHTML = content;
div.style.color = 'green';
document.getElementById('container').appendChild(div);
})(content);
}
var Php = function (content) {
//将内容备份到content中,以备日后使用
this.content = content;
//创建对象时,通过闭包直接执行,讲内容按照需求的模式插入到页面
(function () {
var div = document.createElement('div');
div.innerHTML = content;
div.style.color = 'blue';
document.getElementById('container').appendChild(div);
})(content);
}
上面的需求都有相同类似的模式,这种模式有点类似简单工厂模式,我们可以使用简单工厂模式来实现:
var jobFactory = function (type, content) {
switch (type){
case 'java':
return new Java(content);
case 'php':
return new Php(content);
}
}
这样也是能达到需求的要求的,而且使代码看起来更有层次结构,但是如果此时需求发生了变化,发布的广告的数目增加了,内容和颜色也发生了相应的变化,如果我们依旧使用简单工厂模式的话,就会发现我们需要修改两处,新增一个类然后修改简单工厂模式的方法,这样看来简单工厂模式反而没有简化,变得更加复杂了。这时候就推荐使用工厂模式了。
所谓的工厂模式就是将实际创建对象的工作交由子类来完成,这样这个类就成了抽象类。
//安全模式创建的工厂类
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) {
//将内容备份到content中,以备日后使用
this.content = content;
//创建对象时,通过闭包直接执行,讲内容按照需求的模式插入到页面
(function () {
var div = document.createElement('div');
div.innerHTML = content;
div.style.color = 'green';
document.getElementById('container').appendChild(div);
})(content);
},
Php : function (content) {
//将内容备份到content中,以备日后使用
this.content = content;
//创建对象时,通过闭包直接执行,讲内容按照需求的模式插入到页面
(function () {
var div = document.createElement('div');
div.innerHTML = content;
div.style.color = 'green';
document.getElementById('container').appendChild(div);
})(content);
}
}
这样如果以后有新增类似的需求,我们只需要在Factory的原型中添加对应的基类实现就可以了。这个就是工厂模式的精华所在。
高质量的代码就是对程序自己最好的注释。当你打算要添加注释时,问问自己,“我如何能改进编码以至于根本不需要添加注释?”改进你的代码,然后才是用注释使它更清楚。