工廠模式主要是為創建物件提供過渡介面,以便將創建物件的具體程序屏蔽隔離起來,達到提高靈活性的目的,
工廠模式分為三類,文章會一一介紹,
文章目錄
- 1 簡單工廠模式
- 1.1 概述
- 1.2 構建組成
- 1.3 代碼實體
- 1.4 分析總結
- 2 工廠方法模式
- 2.1 概述
- 2.2 構建組成
- 2.3 代碼實體
- 3 抽象工廠模式
- 3.1 概述
- 3.2 構建組成
- 3.3 代碼實體
- 4 總結
1 簡單工廠模式
1.1 概述
簡單工廠模式又稱為靜態工廠模式,重命名上就可以看出這個模式一定很簡單,它存在的目的很簡單:定義一個用于創建物件的借口
1.2 構建組成
-
工廠類角色:這是本模式的核心,含有一定的商業邏輯和判斷邏輯,
-
抽象產 品角色:它一般是具體產品繼承的父類或者實作的介面,
-
具體產品角色:工廠類所創建的物件就是此角色的實體,


1.3 代碼實體
模擬工廠生產三種水果
# include<iostream>
using namespace std;
//抽象水果
class abstractFruit
{
public:
virtual void show() = 0;
};
//蘋果類
class Apple:public abstractFruit
{
public:
void show()
{
cout<<"我是蘋果!"<<endl;
}
};
//香蕉
class Banana :public abstractFruit
{
public:
void show()
{
cout << "我是香蕉!" << endl;
}
};
//鴨梨
class Pear :public abstractFruit
{
public:
void show()
{
cout << "我是鴨梨!" << endl;
}
};
class FruitFactory
{
public:
abstractFruit* CreateFruit(string flat)
{
if (flat == "Apple")
{
return new Apple;
}
else if (flat == "Banana")
{
return new Banana;
}
else if (flat == "Pear")
{
return new Pear;
}
else
{
cout<<"工廠內暫時未生產該類別"<<endl;
return NULL;
}
}
};
# if 1
int main()
{
FruitFactory* Factor1 = new FruitFactory;
abstractFruit* apple= Factor1->CreateFruit("Apple");
apple->show();
abstractFruit* Banana = Factor1->CreateFruit("Banana");
Banana->show();
abstractFruit* Pear = Factor1->CreateFruit("Pear");
Pear->show();
delete(apple);
delete(Banana);
delete(Pear);
return 0;
}
# endif

1.4 分析總結
使用簡單工廠模式后,程式更加符合現實中的情況:而且客戶端免除了直接創建產品物件的責任,
但從開閉原則分析,當我們增加一種水果的時候,只要符合抽象產品制定的合同,那么只要通知工廠類知道就可以被客戶使用了,所以對產品部分來說,它符合開閉原則;但是工廠部分好像不太理想,因為每次增加一種水果,都要在工廠類中增加相應的業務邏輯或者判斷邏,這顯然是違背開閉原則的,可想而知對于新產品的加入,工廠類是很被動的,
2 工廠方法模式
2.1 概述
工廠方法模式去掉了簡單工廠模式中工廠方法的靜態屬性,使得它可以被子類繼承,這樣在簡單工廠模式里集中在工廠方法上的壓力可以由工廠方法模式里不同的工廠子類來分擔,
2.2 構建組成
- 抽象工廠 角色:這是工廠方法模式的核心,它與應用程式無關,是具體工廠角色必須實作的介面或者必須繼承的父類,
- 具體工廠角色:它含有和具體業務邏輯有關的代碼,由應用程式呼叫以創建對應的具體產品的物件,
- 抽象產品角色:它是具體產品繼承的父類或者是實作的介面,
- 具體產 品角色:具體工廠角色所創建的物件就是此角色的實體,


2.3 代碼實體
# include<iostream>
using namespace std;
//抽象水果
class abstractFruit
{
public:
virtual void show() = 0;
};
//蘋果類
class Apple :public abstractFruit
{
public:
void show()
{
cout << "我是蘋果!" << endl;
}
};
//香蕉
class Banana :public abstractFruit
{
public:
void show()
{
cout << "我是香蕉!" << endl;
}
};
//鴨梨
class Pear :public abstractFruit
{
public:
void show()
{
cout << "我是鴨梨!" << endl;
}
};
//抽象工廠
class AbstractFruitFactory
{
public:
virtual abstractFruit* GreateFruit() = 0;
};
//具體蘋果廠
class AppleFactory :public AbstractFruitFactory
{
public:
abstractFruit* GreateFruit()
{
return new Apple;
}
};
//具體一個香蕉工廠
class BananaFactory :public AbstractFruitFactory
{
public:
abstractFruit* GreateFruit()
{
return new Banana;
}
};
//具體的鴨梨廠
class PearFactory :public AbstractFruitFactory
{
public:
abstractFruit* GreateFruit()
{
return new Pear;
}
};
int main()
{
AbstractFruitFactory* Factory = nullptr;
abstractFruit* Fruit = nullptr;
//創建蘋果廠
Factory = new AppleFactory;
Fruit=Factory->GreateFruit();
Fruit->show();
delete Fruit;
delete Factory;
//創建香蕉廠
Factory = new BananaFactory;
Fruit = Factory->GreateFruit();
Fruit->show();
delete Fruit;
delete Factory;
//創建鴨梨廠
Factory = new PearFactory;
Fruit = Factory->GreateFruit();
Fruit->show();
delete Fruit;
delete Factory;
return 0;
}
3 抽象工廠模式
3.1 概述
抽象工廠模式提供了一個創建一系列相關或者相互依賴物件的介面,無需指定它們具體的類
-
產品族:同一產地或者同一產商,功能不同
-
產品等級:功能不同,產地或者產商不同
-
抽象工廠針對的產品族 而不是產品等級結構
-
如果我增加一個水果,不符合開閉原則,
-
但是多幾個工廠 就符合開閉原則
-
總結:對于產品族符合開閉原則 產品等級不符合開閉原則

3.2 構建組成
和工廠方法一致
- 抽象工廠 角色:這是工廠方法模式的核心,它與應用程式無關,是具體工廠角色必須實作的介面或者必須繼承的父類,
- 具體工廠角色:它含有和具體業務邏輯有關的代碼,由應用程式呼叫以創建對應的具體產品的物件,
- 抽象產品角色:它是具體產品繼承的父類或者是實作的介面,
- 具體產 品角色:具體工廠角色所創建的物件就是此角色的實體,
3.3 代碼實體
# include<iostream>
using namespace std;
//抽象工廠針對的產品族 而不是產品等級結構
//產品族 同一個產地或者同一個廠商
//產品等級:功能相同 產地或者廠商不同
//如果我增加一個水果,不符合開閉原則,
//但是多幾個工廠 就符合開閉原則
//總結 對于產品族符合開閉原則 產品等級不符合開閉原則
//抽象蘋果
class AbstractApple
{
public:
virtual void show()= 0;
};
//中國蘋果
class ChineseApple :public AbstractApple
{
public:
void show()
{
cout << "中國蘋果"<<endl;
}
};
//美國蘋果
class USAApple :public AbstractApple
{
public:
void show()
{
cout << "美國蘋果" << endl;
}
};
//日本蘋果
class JapanApple :public AbstractApple
{
public:
void show()
{
cout << "日本蘋果" << endl;
}
};
//抽象香蕉
class AbstractBanana
{
public:
virtual void show() = 0;
};
//中國香蕉
class ChineseBanana :public AbstractBanana
{
public:
void show()
{
cout << "中國香蕉" << endl;
}
};
//美國香蕉
class USABanana :public AbstractBanana
{
public:
void show()
{
cout << "美國香蕉" << endl;
}
};
//日本香蕉
class JapanBanana :public AbstractBanana
{
public:
void show()
{
cout << "日本香蕉" << endl;
}
};
//抽象工廠
class AbstractFactory
{
public:
virtual AbstractApple* CreateApple() = 0;
virtual AbstractBanana* CreateBanana() = 0;
};
//中國工廠
class ChineseFactor :public AbstractFactory
{
public:
AbstractApple* CreateApple()
{
return new ChineseApple;
}
AbstractBanana* CreateBanana()
{
return new ChineseBanana;
}
};
//美國工廠
class USAFactor :public AbstractFactory
{
public:
AbstractApple* CreateApple()
{
return new USAApple;
}
AbstractBanana* CreateBanana()
{
return new USABanana;
}
};
//日本工廠
class JapanFactor :public AbstractFactory
{
public:
AbstractApple* CreateApple()
{
return new JapanApple;
}
AbstractBanana* CreateBanana()
{
return new JapanBanana;
}
};
int main()
{
AbstractFactory* factory = NULL;
AbstractApple* apple = NULL;
AbstractBanana* banana = NULL;
//中國工廠
factory = new ChineseFactor;
apple=factory->CreateApple();
banana = factory->CreateBanana();
apple->show();
banana->show();
delete(banana);
delete(apple);
delete(factory);
//美國工廠
factory = new USAFactor;
apple = factory->CreateApple();
banana = factory->CreateBanana();
apple->show();
banana->show();
delete(banana);
delete(apple);
delete(factory);
//日本工廠
factory = new JapanFactor;
apple = factory->CreateApple();
banana = factory->CreateBanana();
apple->show();
banana->show();
delete(banana);
delete(apple);
delete(factory);
}
4 總結
工廠模式也是比較常見,需要注意的是三種工廠模式的區別、使用場景和適用條件,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/273761.html
標籤:其他
