定义
通过对产品类的抽象使其创建业务主要负责用于多类产品的实例。
这是一个什么样的模式?
创建多个学科类,如果使用简单工厂模式进行:
//创建Java part
var Java = function (content){
//.....
}
//创建 PHP part
var Php = function (content){
//......
}
//创建 JavaScript part
var JavaScript = function (content){
this. content = content;(function (content){
var div = document. createElement( 'div') ;
div. innerHTML = content;
div. style. background = 'pink' ;
document . getElementById('container').appendChild(div);
})(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) ;
}
}
每多一个 part, 就要再次重复这个工作,比较麻烦。
工厂方法的本意是说将实际创建对象工作推迟到子类中。这样核心类就成了抽象类,不过在Javascript中,没有像传统创建抽象类那样的方式轻易创建抽象类。可以将工厂方法看作是一个实例化对象的工厂类。使用安全模式类。
安全模式类
屏蔽对类使用造成的错误。比如对于Demo类的创建,创建类是需要new关键字的,但是如果其他人不知道这是一个类,会忽略new关键字,直接执行类。
var Demo = function(){};
Demo.prototype = {
show:function(){
console.log('Get!!!');
}
}
var d = new Demo();
d.show();
var d = Demo();
d.show();
为了避免这种错误的发生,在构造函数开始前先判断当前对象this指代是不是类(Demo),如果是就通过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){
//......
},
JavaScript : function (content) {
//.......
},
UI : function (content) {
this. content = content;
(function (content){
var div = document . createElement ( 'div');
div. innerHTML = content;
div.style.border = '1px solid red';
document. getElementById('container').appendChild(div) ;
}) (content);
},
php : function (content) {
//.......
}
};
如果需要添加类,只需要在Factory这个工厂类的原型中进行编写。
总结
对于创建多类对象,简单工厂模式是不行的。通过工厂方法模式,可以轻松创建多个类的实例对象,同时也避免了使用者与对象类之间的耦合,用户不必关系创建对象的具体类,只需要调用工厂方法就行。
如果我需要的产品很多的话,需要创建非常多的工厂,所以这种方式的缺点也很明显;