一、定義
工廠方法模式屬於類的創建型模式,又被稱爲多態工廠方法模式 。工廠方法模式的意義是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。
相比於簡單工廠模式,工廠方法模式的工廠類不再負責產品的創建,而是將工廠類成爲一個抽象工廠角色,僅提供具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品,符合設計模式的開放-封閉原則。
二、角色
1.抽象工廠(Creator)角色
工廠方法模式的核心,任何工廠類都必須實現這個接口。
2.具體工廠( Concrete Creator)角色
具體工廠類是抽象工廠的一個實現,負責實例化具體產品對象。
3.抽象(Product)角色
工廠方法模式所創建的所有產品對象的父類,它負責描述所有實例所共有的公共接口。
4.具體產品(Concrete Product)角色
UML類圖如下:
三、實現
#include<iostream>
using namespace std;
//抽象水果
class AbstructFruit{
public:
virtual void getName() = 0;
};
//抽象工廠
class AbstractFactory{
public:
virtual AbstructFruit* getFruit() = 0 ;
};
//具體水果
class Apple:public AbstructFruit{
public:
void getName(){
cout<<"I'm apple"<<endl;
}
};
//生產具體水果的具體工廠
class AppleFactory:public AbstractFactory{
public:
AbstructFruit* getFruit(){
return new Apple;
}
};
class Banana:public AbstructFruit{
public:
void getName(){
cout<<"I'm banana"<<endl;
}
};
class BananaFactory:public AbstractFactory{
public:
AbstructFruit* getFruit(){
return new Banana;
}
};
int main(){
AbstractFactory *factory = nullptr;
AbstructFruit *fruit = nullptr;
//生產香蕉
factory = new BananaFactory;
fruit = factory->getFruit();
fruit->getName();
delete fruit;
delete factory;
//生產蘋果
factory = new AppleFactory;
fruit = factory->getFruit();
fruit->getName();
delete fruit;
delete factory;
//生產其他水果,則在實現具體水果類和生產具體水果的工廠類即可。不需要改變源代碼。
return 0 ;
}
四、簡單工廠模式和工廠方法模式的比較
工廠方法模式與簡單工廠模式在結構上的不同不是很明顯。工廠方法模式類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。
工廠方法模式之所以有一個別名叫多態性工廠方法模式是因爲具體工廠類都有共同的接口,或者有共同的抽象父類。
當系統擴展需要添加新的產品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有工廠對象不需要進行任何修改,也不需要修改客戶端,很好的符合了“開放-封閉”原則。而簡單工廠模式在添加新產品對象後不得不修改工廠方法,擴展性不好。工廠方法模式退化後可以演變成簡單工廠模式。
五、優缺點
優點:
符合設計模式的開放-封閉原則,添加新功能只需要實現對應接口即可。
缺點:
以爲每增加一個功能,就必須實現一個具體工廠和一個具體功能產品,所以當要進行大量添加功能時,代碼會很臃腫,不好維護。
五、應用場景
1.消費者不關心它所要創建對象的類(產品類)的時候。
2.消費者知道它所要創建對象的類(產品類),但不關心如何創建的時候。