在做面向對象的軟件開發時我們往往想達到更高的代碼可複用性和更合理的軟件顆粒度。
根據《設計模式——可複用面向對象軟件的基礎》所說:“你必須找到相關的對象,以適當的顆粒度將他們迴歸類,再定義類的接口和繼承層次,建立對象之間的基本關係。你的設計應該對手頭的問題有針對性,同時對將來的問題和需求也要有足夠的通用性。”
內行的設計者知道:不是解決任何問題都要從頭做起。他們更願意複用以前使用的解決方案。這些重複的模式方案解決特定的問題,使得面向對象的設計更靈活、優雅,最終複用性更好。它們幫助設計者將新的設計建立在以往的工作基礎上,複用以往的成功設計方案。一個熟悉這些設計模式的設計者不需要再去發現它們,而能夠立即將他們應用於設計問題中。
本系列文章主要參考文獻爲——設計模式,可複用面向對象軟件的基礎(Design Patterns Elements of Reusable Object-Oriented SoftWare Erich.),內部代碼基本用C++語言編寫。
彙總鏈接:23種設計模式C++實現——概要(索引彙總)
摘要
工廠模式主要分爲三類,1、簡單工廠模式;2、工廠方法模式;3、抽象工廠模式,通常大家會將1,2放在一起,因爲這兩種相對第3種會簡單一些,頭兩種均是包含創建特定對象的單一接口,讓子類去決定實例化哪一個類。但是抽象工廠模式不同,他是創建一系列相關或相互依賴對象的接口,並且不需要指定他們具體的類。
可能看了上邊的摘要還是不太懂,看下邊的具體實例講解。
1、簡單工廠模式
簡單工廠是由一個抽象產品類和一個具體工廠類實現的;
【例圖】
/****************************************************************
Author : BingLee
Date : 2019-03-05
Info :
https://blog.csdn.net/Bing_Lee (C)All rights reserved.
******************************************************************/
//抽象產品類
#include <stdio.h>
#include <string>
class BMW
{
public:
virtual void GetCar() = 0;
};
//具體產品1
class BMW320 : public BMW
{
public:
BMW320(){}
void GetCar(){printf("BMW320 \n");}
};
//具體產品2
class BMW520 : public BMW
{
public:
BMW520(){}
void GetCar(){printf("BMW520 \n");}
};
//具體工廠類
class SimpleFactory
{
public:
SimpleFactory(){}
BMW *CreatCar(std::string name){
if(name == "BMW320")
return new BMW320();
else if(name == "BMW520")
return new BMW520();
else
return NULL;
}
};
//客戶類
#include <QCoreApplication>
#include "simplefactory.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
SimpleFactory bmwFactory;
BMW *carA = bmwFactory.CreatCar("BMW320");
BMW *carB = bmwFactory.CreatCar("BMW520");
carA->GetCar();
carB->GetCar();
return a.exec();
}
/*理論輸出
BMW320
BMW520
*/
1、工廠方法模式
工廠方法由一個抽象產品類和一個抽象工廠組成,具體如下
【例圖】
/****************************************************************
Author : BingLee
Date : 2019-03-05
Info :
https://blog.csdn.net/Bing_Lee (C)All rights reserved.
******************************************************************/
#include <stdio.h>
#include <string>
//抽象產品類
class BMW
{
public:
virtual void GetCar() = 0;
};
//具體產品1
class BMW320 : public BMW
{
public:
BMW320(){}
void GetCar(){printf("BMW320 \n");}
};
//具體產品2
class BMW520 : public BMW
{
public:
BMW520(){}
void GetCar(){printf("BMW520 \n");}
};
//工廠方法與簡單工廠由基本相同的產品,區別在於抽象非具體的工廠
//抽象工廠類
class Factory
{
public:
virtual BMW *CreatCar() = 0;
};
//具體工廠1
class BMW320Factory : public Factory
{
public:
BMW *CreatCar()
{
return new BMW320();
}
};
//具體工廠2
class BMW520Factory : public Factory
{
public:
BMW *CreatCar()
{
return new BMW520();
}
};
//客戶端
#include <QCoreApplication>
#include "simplefactory.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Factory *factory1 = new BMW320Factory();
Factory *factory2 = new BMW520Factory();
BMW *car1 = factory1->CreatCar();
BMW *car2 = factory2->CreatCar();
car1->GetCar();
car2->GetCar();
return a.exec();
}
/*理論輸出
BMW320
BMW520
*/
- 當一個類不知道它所必須創建的對象類的時候;
- 當一個類希望由他的子類來指定他所創建的對象的時候;
- 當類將創建對象的職責委託給多個幫助子類中的某一個時,並且希望將哪一個幫助子類是代理者這一信息局部化的時候;
簡單工廠屬於最基本的工廠方法,試用工廠方法模式使用情況第1條,其餘按情況選擇是用工廠方法模式或是抽象工廠模式。
本篇博客中的代碼均已通過編譯,如有Bug,請提出寶貴意見~