javascript模式——Factory
Facotry模式是一种创建型模式,他不同于一般编码习惯,显示的调用各个构造函数。Factory模式是提供一个通用的接口来创建对象。
一个Factory模式压缩所有对象创建的方式,降低这个工厂与其它对象的耦合。
用一段代码来演示,我们用Factory模式做一家汽车工厂程序。
// 工厂类 var Factory = { createVehicle:function(type){ var carFactory; switch(type){ case 'car': carFactory = Object.create(this.Car); break; case 'car': carFactory = Object.create(this.Truck); break; } return carFactory; }, // 汽车类 Car: { doors: 4, }, // 卡车类 Truck: { doors: 6, color: 'blue', } // 其它工厂类代码 } // 实例化一个工厂 var factory = Object.create(Factory); // 通过工厂的入口实例化汽车 var car = factory.createVehicle('car');
由代码可以看出,我们不是用Object.create(Factory.Car)或Object.create(Factory.Truck)显示创建相应实例,而是用一个createVehicle函数来管理,根据不同的参数调用不同的汽车类创建不同的实例。用这种方式,后面的程序创建汽车实例将只依赖factory.createVehicle这个入口函数,大大降低了耦合。
由于IE8并不支持Object.create,我们可以用MDN提供的polyfill进行兼容处理。
// Polyfill if (!Object.create) { Object.create = function (o) { if (arguments.length > 1) { throw new Error('Object.create implementation only accepts the first parameter.'); } function F() {} F.prototype = o; return new F(); }; }
工厂方法一般是使用一个入口函数,运用switch语句进行不同产品实例的创建,所以,我们在创建实例的时候不用去考虑工厂里是如何实现的。
而抽象工厂是在已经有若干个工厂的前提下,抽象出一个统一的接口,它把这些工厂生产的东西当做同一类。抽象工厂更像是一种策略。