JS设计模式-工厂模式

工厂模式


例子一:
//父构造函数
function CarMaker(){}
CarMaker.prototype.drive = function(){
return this.name;
}
//静态工厂方法
CarMaker.factory = function(type){
var constr = type,
newcar;
//如果构造函数不存在,则抛出一个错误
if(typeof CarMaker[constr] !== "function"){
throw{
name : "Error",
message : constr + "不存在"
};
}
//我们使得原型继承父类,但仅继承一次
if(typeof CarMaker[constr].prototype.drive !== "function"){
CarMaker[constr].prototype = new CarMaker();
}
newcar = new CarMaker[constr]();
return newcar;
}
//定义汽车制造商
CarMaker.Compact = function(){
this.name = "Compact";
}
CarMaker.Convertible = function(){
this.name = "Convertible";
}
CarMaker.SUV = function(){
this.name = "SUV";
}
var aa = CarMaker.factory("Compact");
console.log(aa.name); //Compact
console.log(aa.drive()); //Compact


例子二:
var page = page || {};
page.a = function(){
this.method1 = function(){
alert("a");
}
}
page.b = function(){
this.method1 = function(){
alert("b");
}
}
page.c = function(){
this.method1 = function(){
alert("c");
}
}
page.factory = function(type){
return new page[type];
}
var aa = page.factory('a');
aa.method1();
//alert("aa")


JS内置的全局Object()构造函数,也表现为工厂模式
例子:
var o = new Object(),
n = new Object(1),
s = new Object('1'),
b = new Object(true);
o.constructor === Object;
n.constructor === Number;
s.constructor === String;
b.constructor === Boolean;
//以上结果都为true
注意:无论使用new操作符与否,都可以调用Object()


工厂模式有利于消除对象间的耦合,通过工程方法而不是new关键字,将所有实例化的代码集中在一个位子防止代码重复
工厂模式弊端:大多数类最好使用new关键字和构造函数,可以让代码简单易读,而不必去查看工厂方法来知道

你可能感兴趣的:(JavaScript)