天天看點

設計模式——工廠設計模式(c++版,簡單了解)

工廠設計模式

它屬于建立型模式,他提供了一種建立對象的最佳方式,他建立對象時不會對用戶端暴露建立的邏輯,并且通過一個共同的接口來指向新建立的對象。

簡單工廠模式

舉個?:你和同學去金拱門,看着小姐姐頭上的菜單,你看上了個兒童套餐A,你基友看上了兒童套餐B。你點餐的時候隻用給小姐姐說要個兒童套餐A,等會你就會得到一個漢堡,一杯可樂,一份大薯和你看上的玩具。而且你和你基友領餐的時候都在同一個領餐區,你們不知道這個漢堡是如何做出來的,不知道是哪個小哥哥炸出來的,不知道炸了幾分鐘。這是一個典型的工廠模式的?。

一個簡單工廠設計模式包含了以下4個角色:

  1. 抽象工廠:工廠的基類,提供公共的操作接口(我們所說的“金拱門”,他屬于一個品牌)
  2. 具體工廠:這是簡單工廠的核心,用來生産産品的(相當于我們進入的一家金拱門實體店)
  3. 抽象産品:具體産品的基類,提供産品操作的公共接口(相當于菜單,因為它是所有産品的一個抽象)
  4. 具體産品:抽象産品的實作(漢堡、薯條、可樂、套餐)
設計模式——工廠設計模式(c++版,簡單了解)

簡單工廠模式結構圖

代碼:

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;
}
           

實驗截圖:

設計模式——工廠設計模式(c++版,簡單了解)

繼續閱讀