模式說明(總結這個模式是什麼)
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