1 簡單工廠模式:
将功能相似的類統一繼承于一個抽象基類(Abstract Base Class),将這些子類的執行個體化交給一個工廠類來完成。應用多态和封裝的思想,子類的代碼對用戶端不開放。使用基類指針或引用調用virtual函數,動态地确定調用函數的子類類型。
2 例程功能:
實作一個收銀台計費程式,根據正常收費(N),打折收費(D)或返現收費(R)來确定收費金額。
3 例程設計思路:
簡化程式功能,隻計算單一商品價格,輸入原價,指定收費模式,輸出金額。
為三種收費模式分别建立一個類,均繼承于基類CashSuper。
建立工廠類CashFactory,管理上述子類的執行個體化。
由指向子類對象的基類指針調用相應子類的收費函數acceptCash來計算金額。
4 程式設計環境:
win10 64位+Qt 5.3 +MinGW 4.8.2
5 工程截圖:
6 實作代碼:
//cashsuper.h
//收費模式的抽象基類
#ifndef CASHSUPER_H
#define CASHSUPER_H
class CashSuper
{
public:
//CashSuper();//抽象基類不能執行個體化,不需要構造函數
//純虛函數聲明,不需要定義
virtual double acceptCash(double money)=;
};
#endif // CASHSUPER_H
//cashsuper.cpp
#include "cashsuper.h"
//CashSuper::CashSuper()
//{
//}
//cashnormal.h
#ifndef CASHNORMAL_H
#define CASHNORMAL_H
#include "cashsuper.h"
class CashNormal:public CashSuper
{
public:
CashNormal();
//重載
double acceptCash(double money){
return money;//直接傳回money
}
};
#endif // CASHNORMAL_H
//cashnormal.cpp
#include "cashnormal.h"
CashNormal::CashNormal()
{
}
//cashrebate.h
#ifndef CASHREBATE_H
#define CASHREBATE_H
#include "cashsuper.h"
class CashRebate:public CashSuper
{
public:
//構造函數需要初始化折扣率
CashRebate(double moneyRebate_in);
//重載
double acceptCash(double money);
private:
double moneyRebate;
};
#endif // CASHREBATE_H
//cashrebate.cpp
#include "cashrebate.h"
CashRebate::CashRebate(double moneyRebate_in)
{
moneyRebate=moneyRebate_in;
}
double CashRebate::acceptCash(double money)
{
return money*moneyRebate;
}
//cashreturn.h
#ifndef CASHRETURN_H
#define CASHRETURN_H
#include "cashsuper.h"
class CashReturn:public CashSuper
{
public:
CashReturn(double moneyCondition_in,double moneyReturn_in);
//重載
double acceptCash(double money);
private:
double moneyCondition;
double moneyReturn;
};
#endif // CASHRETURN_H
//cashreturn.cpp
#include "cashreturn.h"
CashReturn::CashReturn(double moneyCondition_in,double moneyReturn_in)
{
moneyCondition=moneyCondition_in;
moneyReturn=moneyReturn_in;
}
double CashReturn::acceptCash(double money)
{
return money-(int)(money/moneyCondition)*moneyReturn;
}
//cashfactory.h
#ifndef CASHFACTORY_H
#define CASHFACTORY_H
#include "cashsuper.h"
#include "cashnormal.h"
#include "cashrebate.h"
#include "cashreturn.h"
class CashFactory
{
public:
CashFactory();
//return pointer to CashSuper for polymorphism
//傳回基類的指針,才能使用多态
static CashSuper* createCashAccept(char type);
};
#endif // CASHFACTORY_H
//cashfactory.cpp
#include "cashfactory.h"
CashFactory::CashFactory()
{
}
CashSuper* CashFactory::createCashAccept(char type)
{
CashSuper* pCashSuper=;
switch(type)
{
case 'N'://正常模式
pCashSuper=new CashNormal();
break;
case 'R'://返現模式
pCashSuper=new CashReturn(,);
break;
case 'D'://打折模式
pCashSuper=new CashRebate();
break;
}
return pCashSuper;
}
//main.cpp
#include <iostream>
#include "cashsuper.h"
#include "cashfactory.h"
int main()
{
CashFactory obj_cash_factory;
CashSuper* pCashSuper=obj_cash_factory.createCashAccept('N');
//CashSuper* pCashSuper=obj_cash_factory.createCashAccept('N');
//CashSuper* pCashSuper=obj_cash_factory.createCashAccept('N');
std::cout<<"The Price is: "<<pCashSuper->acceptCash()<<std::endl;
}
7 總結
簡單工廠模式将子類封裝了起來,用戶端不可見。但是沒有封裝基類CashSuper,仍需要在用戶端調用之。