工廠方法模式
概念
工廠方法模式同樣屬于類的創建型模式又被稱為多態工廠模式 。
工廠方法模式的意義
定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。 核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類 必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
工廠方法模式的角色和職責
抽象工廠(Creator)角色
工廠方法模式的核心,任何工廠類都必須實現這個接口。
具體工廠( Concrete Creator)角色
具體工廠類是抽象工廠的一個實現,負責實例化產品對象。
抽象(Product)角色
工廠方法模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
具體產品(ConcreteProduct)角色
工廠方法模式所創建的具體實例對象
工廠方法模式的實現
#include<iostream>
using namespace std;//抽象水果
class AbstractFruit{
public:virtual void ShowName() = 0;};//蘋果
class Apple :public AbstractFruit{virtual void ShowName(){cout << "我是蘋果" << endl;}
};//香蕉
class Banana :public AbstractFruit{
public:virtual void ShowName(){cout << "我是香蕉" << endl;}
};//梨子
class Pear :public AbstractFruit{
public:virtual void ShowName(){cout << "我是梨子" << endl;}
};//把工廠抽象出來
class AbstractFruitFactory{
public:virtual AbstractFruit* CreateFruit() = 0;};
//蘋果工廠
class AppleFactiry :public AbstractFruitFactory{
public:virtual AbstractFruit *CreateFruit(){return new Apple;}
};
//香蕉工廠
class BananaFactory :public AbstractFruitFactory{
public:virtual AbstractFruit * CreateFruit(){return new Banana;}
};//梨子工廠
class PearFactory :public AbstractFruitFactory{
public:virtual AbstractFruit * CreateFruit(){return new Pear;}
};void test01(){AbstractFruitFactory *factory = NULL;AbstractFruit *fruit = NULL;//創建蘋果工廠factory = new AppleFactiry;fruit = factory->CreateFruit();fruit->ShowName();delete fruit;delete factory;//創建一個香蕉工廠factory = new BananaFactory;fruit = factory->CreateFruit();fruit->ShowName();delete fruit;delete factory;//創建一個梨子工廠factory = new PearFactory;fruit = factory->CreateFruit();fruit->ShowName();delete fruit;delete factory;
}int main(void)
{test01();system("pause");return 0;
}
工廠方法模式的優點
- 不需要記住具體類名,有時不需要記住具體參數
- 實現了對象創建和使用的分離
- 系統的可擴展性也的非常好,無需修改接口和原類。
工廠方法模式的缺點
- 類的個數成本增加,導致類越來越多,增加維護成本
- 判斷邏輯在客戶端,需要自己判斷新加的產品是否需要新建工廠。
工廠方法模式和簡單工廠模式比較
- 工廠方法模式與簡單工廠模式在結構上的不同不是很明顯。工廠方法類的核心是一個抽 象工廠類,而簡單工廠模式把核心放在一個具體類上。
- 工廠方法模式之所以有一個別名叫多態性工廠模式是因為具體工廠類都有共同的接口, 或者有共同的抽象父類。
- 當系統擴展需要添加新的產品對象時,僅僅需要添加一個具體對象以及一個具體工廠對 象,原有工廠對象不需要進行任何修改,也不需要修改客戶端,很好的符合了“開放-封閉” 原則。而簡單工廠模式在添加新產品對象后不得不修改工廠方法,擴展性不好。工廠方法模 式退化后可以演變成簡單工廠模式