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语句进行不同产品实例的创建,所以,我们在创建实例的时候不用去考虑工厂里是如何实现的。

而抽象工厂是在已经有若干个工厂的前提下,抽象出一个统一的接口,它把这些工厂生产的东西当做同一类。抽象工厂更像是一种策略。

http://robdodson.me/javascript-design-patterns-factory/

原文地址:https://www.cnblogs.com/winderby/p/4323279.html