05.Javascript设计模式之工厂模式----Factory

 

 05.Javascript设计模式之工厂模式----Factory

前面章节介绍了简单工厂的设计模式,而在设计模式中,还有一个更重要的,就是工厂模式。

真正的工厂模式与简单工厂模式的区别在于,它不像前面简单工厂的例子中那样,不是另外有使用一个类或对象来创建自行车,而是使用一个子类。

工厂模式的正式定义为:工厂是一个将其成员对象的实例化推迟到子类中进行的类。

工厂的定义

为了和简单工厂形成对比,这里还是采用BicycleShop为例来说明工厂模式的设计理念。

我们打算让各个自行车商店自行决定从哪个生产厂家进货。鉴于此,单靠一个自行车工厂(BicycleFactory)是无法提供需要的所有的自行车的。 所以我们考虑将BicycleShop设计为一个抽象类,让子类根据各自的进货渠道实现其进货自行车(createBicycle)的工作:

var BicycleShop = function(){};
BicycleShop.prototype = {
    sellBicycle : function(model){
        //让其子类来完成这个工作
        var bicycle = this.createBicycle(model);

        //下面的代码仍然没有变
        //自行车组装
        bicycle.assemble();
        //自行车清洗
        bicycle.wash();

        return bicycle;
    },

    //抽象方法,必须实现后才能调用
    createBicycle : function(model){
        throw new Error("必须通过子类的实例才能调用此方法,进货自行车");
    }
};

BicycleShop类中定义了一个createBicycle方法,该方法一旦调用就会抛出异常,因此,该类是不能直接实例化的,该抽象类必须被继承,通过其子类来完成createBicycle的工作,

工厂模式实现

下面定义了两个子类,一个子类代表从Oracle公司进货的商店,一个子类代表从IBM公司进货的商店,代码如下:

//Oracle自行车商店
var OracleBicycleShop = function(){};
//继承父类
inherits(OracleBicycleShop,BicycleShop);
//实现createBicycle方法
OracleBicycleShop.prototype.createBicycle = function(model){
    var bicycle;
    //生产自行车
    switch(model){
        case "speedster":
            bicycle = new OracleSpeedster();
            break;
        case "lowrider":
            bicycle = new OracleLowrider();
            break;
        case "Alien":   
            bicycle = new OracleAlien();
            break;
        case "comfort cruiser":
        default :
            bicycle = new OracleComfortCruiser();
    }
    return bicycle;
};

//IBM自行车商店
var IBMBicycleShop = function(){};
//继承父类
inherits(IBMBicycleShop,BicycleShop);
//实现createBicycle方法
IBMBicycleShop.prototype.createBicycle = function(model){
    var bicycle;
    //生产自行车
    switch(model){
        case "speedster":
            bicycle = new IBMSpeedster();
            break;
        case "lowrider":
            bicycle = new IBMLowrider();
            break;
        case "Alien":   
            bicycle = new IBMleAlien();
            break;
        case "comfort cruiser":
        default :
            bicycle = new IBMComfortCruiser();
    }
    return bicycle;
};

经过这样的一个设计,就产生了专卖店的概念,OracleBicycleShop表示Oracle自行车专卖店,IBMBicycleShop则表示IBM自行车专卖店。现在,如果用户 需要购买Speedster牌的自行车,无论跑到那个专卖店,都可以买到了,示例代码如下:

//到Oracle专卖店购买
var oracle = new OracleBicycleShop();
var yourNewBicycle = oracle.createBicycle("speedster");

//到IBM专卖店购买
var ibm = new IBMBicycleShop();
var myNewBicycle = ibm.createBicycle("speedster");

即便是要增加对其他生产厂家的支持,也是很简单的,只需要再创建一个BicycleShop的子类并实现其createBicycle方法即可。

根据不同的需求,对各个子类进行修改,以支持更多厂家其他型号的产品,这是工程设计模式最重要的特点。

代码有不正确的地方,请您指正,thanks

 

你可能感兴趣的:(Javascript设计模式)