工厂模式理解

工厂的作用就是生产实例,但其与构造函数不同。工厂是用来生产多种类型实例的。例如,麦当劳可以生产汉堡,薯条和可乐,再例如,美的可以生产冰箱,洗衣机,和空调等。工厂生产的产品必须要用相关性,属于一个产品族或者属于多个相近的产品族。

工厂模式分为三种,分别是

1. 简单工厂,通过switch语句根据产品标识生产不同类型的产品,直接调用各种产品的构造函数
2. 工厂,对简单工厂的优化,将工厂进行抽象,新增产品只需增加指定工厂和产品,不需要修改单一工厂的switch语句,不会影响其他产品
3. 抽象工厂,比工厂模式多的就是,可以生产多个产品族,就是一个工厂可以同时生产多个产品,而普通工厂只能生产一个产品

(ES6)代码实现如下:

1.简单工厂

class SimpleFactory{
    constructor(prodNo) //构造工厂时告知工厂产品标识
    {
        this.prodNo = prodNo;
    }

    GetProduct()
    {
        switch (this.prodNo) //根据产品标识生产产品
        {
            default:
                return new ProductA();
            case 1:
                return new ProductA();
            case 2:
                return new ProductB();
        }

    }
}

//产品接口
class IProduct
{
    //产品方法
    //......
}
//产品A
class ProductA extends IProduct 
{
    //产品属性
    //......
}

//产品B
class ProductB extends IProduct
{
    //产品属性
    //......
}

2.工厂模式

class IFactory //工厂接口
{
    GetProduct(){

    }
}
//A工厂类
class FactoryA extends IFactory
{
    constructor()
    {
        this.productA = new ProductA();
    }
    //A工厂生产A产品
    GetProduct() 
    {
        return this.productA;
    }
}

//B工厂类
class FactoryB extends IFactory
{
    constructor()
    {
        this.productB = new ProductB();
    }
    //B工厂生产B产品
    GetProduct() 
    {
        return this.productB;
    }
}

//产品接口
class IProduct
{
    //产品方法
    //......
}

//产品A
class ProductA extends IProduct
{
    //产品属性
    //......
}

//产品B
class ProductB extends IProduct
{
    //产品属性
    //......
}

3.抽象工厂

//工厂接口,即抽象工厂
class IFactory
{
    CreateFridge();
    CreateAirCondition();
}

//三星的工厂,生产三星的产品族
class SamsungFactory extends IFactory
{

    CreateAirCondition() 
    {
        return new SamsungAirCondition(); //三星的工厂生产三星的空调
        
    }

    CreateFridge()
    {
        return new SamsungFridge(); //三星的工厂生产三星的冰箱
    }
}

//格力的工厂,生产格力的产品族
class GreeFactry extends IFactory
{
    CreateAirCondition()
    {
        return new GreeAirCondition(); //格力的工厂生产格力的空调
    }

    CreateFridge()
    {
        return new GreeFridge(); //格力的工厂生产格力的冰箱
    }
}

//冰箱产品接口
class IFridge
{
    //冰箱产品接口
    //冰箱的action
}

//空调接口
class IAirCondition
{
    //空调产品接口
    //空调的action
}

//三星的冰箱
class SamsungFridge extends IFridge
{
    //三星冰箱的action和property
}
//格力的冰箱
class GreeFridge extends IFridge
{
        //格力冰箱的action和property
}

//三星的空调
class SamsungAirCondition extends IAirCondition
{
    //三星空调的action和property
}
//格力的空调
class GreeAirCondition extends IAirCondition
{
    //格力空调的action和property
}

参考:http://blog.jobbole.com/109594/