設計模式之對象創建型 — Factory Method 工廠方法模式

模式說明(總結這個模式是什麼)

factory method 模式是一種用於創建對象的接口技術。再具體的說就是給一個類寫一個創建某個類的成員函數,這個類是‘工廠’,這個函數就是‘工廠方法’。不過這個類一般是抽象類。一般被創建的類(product)也是抽象的,會有多個版本的子類。工廠方法具體要創建那個product,需要也需要在子類中實現。


結構

這裏寫圖片描述

和abstract factory 的區別

可能也很多小夥伴在看完說明後一臉懵逼。這聽起來怎麼像是abstract factory中的描述啊。沒錯,其實,這兩個模式是說的一個問題,只是側重點不同。

  • abstract factory 說的是抽線工廠技術,重點是這種‘工廠’技術!
    他的目的是通過抽象類,爲客戶提供創建類 統一的抽象接口
  • factory method 說的是創建類的接口技術。重點在這種類方法。
    abstract factory 只是說明了怎麼來提供接口,接口的實現則需要使用factory method 模式。

總之,前者說明了怎麼創建接口,後者說明了怎麼實現接口


可以實現的效果

  • 爲子類提供掛鉤
    貼一個簡單的栗子就懂啦
#include <iostream>
using namespace std;

class A
{
public:
    A(){};
    ~A(){};

    int dis()
    {
        cout << "你是誰?\n" << endl;
        factory_method();
        return 0;
    }

    virtual int factory_method()
    {
        cout << "我是A" << endl;
        return 0;
    }

private:

};


class B :public A
{
public:
    B(){};
    ~B(){};

    int factory_method()
    {
        cout << "我是B" << endl;
        return 0;
    }
private:

};


int main()
{

    B b;
    b.dis();
    getchar();
    return 0;
}

給之類提供一個掛鉤以供對線的擴展版本。

  • 連接平行的類層次
    這種比較好理解,用的也比較多。
    提醒:比如類A的一些工作需要委託給類B ,那麼類A就可以提供創建類B的工廠方法。這樣就可以形成一種平行關係。而且對於客戶來講不需要知道類B是什麼,直接通過類A可以創建

實現

  • Creator 類可以是抽象類,也可以是具體類。具體類可以爲工廠方法提供一個缺省的實現。
  • 參數化工廠方法
    這個很好理解,通過給方法傳遞標識符來區別創建哪一個產品。

    B::methond(flag_id)
    {
    if(flag_id==1) return new product1;
    if(flag_id==2) return new product2;
    return A::methond(flag_id);   //調用父類的方法   子類只是擴展了父類的方法
    }
  • 使用模板來避免創建子類
    之前說了辣麼多,可能發現一個問題,如果要創建一個新的產品,就得寫一個新的工廠子類。分析問題的關鍵是沒法確定到底創建那個產品,所以就不停的創建子類來重新實現方法。這個問題更加抽線的講 就是沒法確定 參數類型!很容易就想到了模板。

    template<calss products>
    Product * ConcreteCreate<products>:: createProduct()
    {
    return new products;
    }

通過模板參數來控制創建那個產品


我的個人網站 http://www.breeziness.cn/
我的CSDN http://blog.csdn.net/qq_33775402

轉載請註明出處 小風code www.breeziness.cn

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章