天天看點

大話設計模式 第一章 簡單工廠模式 C++實作

1 簡單工廠模式:

将功能相似的類統一繼承于一個抽象基類(Abstract Base Class),将這些子類的執行個體化交給一個工廠類來完成。應用多态和封裝的思想,子類的代碼對用戶端不開放。使用基類指針或引用調用virtual函數,動态地确定調用函數的子類類型。

2 例程功能:

實作一個收銀台計費程式,根據正常收費(N),打折收費(D)或返現收費(R)來确定收費金額。

3 例程設計思路:

簡化程式功能,隻計算單一商品價格,輸入原價,指定收費模式,輸出金額。

為三種收費模式分别建立一個類,均繼承于基類CashSuper。

建立工廠類CashFactory,管理上述子類的執行個體化。

由指向子類對象的基類指針調用相應子類的收費函數acceptCash來計算金額。

4 程式設計環境:

win10 64位+Qt 5.3 +MinGW 4.8.2

5 工程截圖:

大話設計模式 第一章 簡單工廠模式 C++實作
大話設計模式 第一章 簡單工廠模式 C++實作

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,仍需要在用戶端調用之。