軟件中,有時需要將對象的創建與使用分離,這時就需要簡單工廠模式了。
一、簡單工廠模式的三個角色
1)工廠(Factory)角色: 簡單工廠模式的核心,它負責實現創建所有的實例的內部邏輯。工廠類可以被外界直接調用,創建所需的產品對象。
2)抽象產品(AbstractProduct)角色:簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
3)具體產品(Concrete Product)角色:簡單工廠模式所創建的具體實例對象。
二、適用場景
1)工廠類負責創建的對象比較少,由於創建的對象比較少,不會造成工廠方法中的業務邏輯太過複雜。
2)客戶端只知道傳入工廠類的參數,對於如何創建對象並不關心。
三、工廠模式的優缺點
1)優點
1.1) 實現了對象創建和使用的分離;
1.2) 不需要記住具體類名,記住參數即可,減少使用者的記憶負擔。
2) 缺點:
2.1)對工廠類職責過重,一旦不能工作,系統受到影響;
2.2)增加系統中類的個數,複雜度和理解度增加;
2.3)違反"開閉原則",添加新產品需要修改工廠邏輯,工廠越來越複雜。
四、案例
4.1 原設計 ver1.1
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
class Fruit
{
public:
Fruit(string kind){
if (this->kind == "apple")
{
}
else if (this->kind == "banana")
{
}
}
void getName(){
if (this->kind == "apple")
{
cout << "I am apple" << endl;
}
else if (this->kind == "banana")
{
cout << "I am banana" << endl;
}
}
private:
string kind; //水果的種類
};
//工廠模式的目的,就是讓業務層和類的構造函數之間解耦合,
//儘量降低一個類的複雜度
int main(void)
{
//要一個蘋果
Fruit apple("apple");
apple.getName();
Fruit banana("banana");
banana.getName();
return 0;
}
4.2)加入了簡單工廠模式的設計 ver1.2
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;
//水果類
class Fruit
{
public:
virtual void getName() = 0;
};
class Apple :public Fruit
{
public:
virtual void getName(){
cout << "apple..." << endl;
}
};
class Banana :public Fruit
{
public:
virtual void getName(){
cout << "banana..." << endl;
}
};
//一個工廠
class Factory
{
public:
//水果的生產器
Fruit* createFruit(string kind){
if (kind == "apple")
{
return new Apple;
}
else if (kind == "banana")
{
return new Banana;
}
}
};
int main(void)
{
Factory *factory = new Factory;
//要一個蘋果
Fruit *apple = factory->createFruit("apple");
apple->getName();
//要香蕉
Fruit *banana = factory->createFruit("banana");
banana->getName();
return 0;
}
版本ver1.2 比ver1.1代碼的可維護性、可擴展性要好。