工廠模式理解

看風景就發表於2018-02-07

工廠的作用就是生產例項,但其與建構函式不同。工廠是用來生產多種型別例項的。例如,麥當勞可以生產漢堡,薯條和可樂,再例如,美的可以生產冰箱,洗衣機,和空調等。工廠生產的產品必須要用相關性,屬於一個產品族或者屬於多個相近的產品族。

工廠模式分為三種,分別是

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/

相關文章