工廠設計模式
它屬于建立型模式,他提供了一種建立對象的最佳方式,他建立對象時不會對用戶端暴露建立的邏輯,并且通過一個共同的接口來指向新建立的對象。
簡單工廠模式
舉個?:你和同學去金拱門,看着小姐姐頭上的菜單,你看上了個兒童套餐A,你基友看上了兒童套餐B。你點餐的時候隻用給小姐姐說要個兒童套餐A,等會你就會得到一個漢堡,一杯可樂,一份大薯和你看上的玩具。而且你和你基友領餐的時候都在同一個領餐區,你們不知道這個漢堡是如何做出來的,不知道是哪個小哥哥炸出來的,不知道炸了幾分鐘。這是一個典型的工廠模式的?。
一個簡單工廠設計模式包含了以下4個角色:
- 抽象工廠:工廠的基類,提供公共的操作接口(我們所說的“金拱門”,他屬于一個品牌)
- 具體工廠:這是簡單工廠的核心,用來生産産品的(相當于我們進入的一家金拱門實體店)
- 抽象産品:具體産品的基類,提供産品操作的公共接口(相當于菜單,因為它是所有産品的一個抽象)
- 具體産品:抽象産品的實作(漢堡、薯條、可樂、套餐)
簡單工廠模式結構圖
代碼:
1.産品的抽象類與具體産品
//food.h
#ifndef FOOD_H
#define FOOD_H
class AbstractFood{
public:
AbstractFood();
virtual ~AbstractFood();
virtual void getFood(int count) = 0;
};
class Coke:public AbstractFood{
public:
Coke(int count);
~Coke();
virtual void getFood(int);
};
class Chips:public AbstractFood{
public:
Chips(int count);
~Chips();
virtual void getFood(int);
};
class Hamburg:public AbstractFood{
public:
Hamburg(int count);
~Hamburg();
virtual void getFood(int);
};
class ChildA:public AbstractFood{
public:
ChildA(int count);
~ChildA();
virtual void getFood(int);
};
#endif
//food.cpp
#include <iostream>
#include "food.h"
using namespace std;
AbstractFood::AbstractFood(){}
AbstractFood::~AbstractFood(){}
Coke::Coke(int count){
cout << "make 可樂 x " << count << endl;
}
Coke::~Coke(){}
Chips::Chips(int count){
cout << "make 薯條 x " << count << endl;
}
Chips::~Chips(){}
Hamburg::Hamburg(int count){
cout << "make 垃圾堡 x " << count << endl;
}
Hamburg::~Hamburg(){}
ChildA::ChildA(int count){
cout << "make 可樂 x " << count << endl;
cout << "make 薯條 x " << count << endl;
cout << "make 垃圾堡 x " << count << endl;
}
ChildA::~ChildA(){}
void Coke::getFood(int count){
while(count--){
cout << "獲得:可樂" << endl;
}
}
void Chips::getFood(int count){
while(count--){
cout << "獲得:薯條" << endl;
}
}
void Hamburg::getFood(int count){
while(count--){
cout << "獲得:辣雞堡" << endl;
}
}
void ChildA::getFood(int count){
while(count--){
cout << "獲得:兒童套餐A" << endl;
}
}
2.工廠的抽象類與工廠的實作類
//JGM.h
#ifndef JGM_H
#define JGM_H
#include <string>
#include "food.h"
using namespace std;
class AbstractFood;
class AbstractJGM{
public:
AbstractJGM();
virtual ~AbstractJGM();
virtual AbstractFood* make_food(int,int) = 0;
};
class JGM:public AbstractJGM{
public:
JGM(string);
~JGM();
virtual AbstractFood* make_food(int,int);
};
#endif
//JGM.cpp
#include <iostream>
#include <string>
#include "JGM.h"
#include "food.h"
using namespace std;
AbstractJGM::AbstractJGM(){}
AbstractJGM::~AbstractJGM(){}
JGM::JGM(string shopName){
cout << "歡迎來到金拱門——" << shopName << "店!" << endl;
}
JGM::~JGM(){}
AbstractFood* JGM::make_food(int type, int count){
switch (type){
case 0: return new Coke(count);
case 1: return new Chips(count);
case 2: return new Hamburg(count);
case 3: return new ChildA(count);
}
return NULL;
}
3.實作了上面的4個角色就完成了
//SimpleFactoryModel.cpp
#include <iostream>
#include <string>
#include "JGM.h"
#include "food.h"
using namespace std;
int main(){
AbstractJGM *jgm = new JGM("北京路"); //你進入北京路的金拱門
int count = 2;
cout << "----------------" << endl;
//0-可樂 1-薯條 2-漢堡 3-兒童套餐A
AbstractFood *food1 = jgm->make_food(3,count); //找小姐姐點了一個兒童套餐
cout << "----------------" << endl;
food1->getFood(count); //得到一個兒童套餐A(他做了什麼你完全不知道,直接得到的是套餐)
return 0;
}
實驗截圖: