c++设计模式之简单工厂模式
模擬場景
要求使用簡單工廠模式設(shè)計一個可以創(chuàng)建不同幾何形狀(如矩形、圓形、三角形)的繪圖工具,每個幾何圖形都具有繪制Draw()和擦除Erase()兩個方法;
UML類圖
分析需求:
首先這個繪圖工具要求可以提供一系列的幾何圖形繪制,包括矩形、圓形、橢圓形、三角形,這些圖形對象要求都具備繪制Draw()和Erase()方法;因此,我們可以定義一個抽象基類CGraph,具有Draw()和Erase()的純虛方法;因?yàn)椴煌膱D形類型,它們的Draw()和Erase()具體實(shí)現(xiàn)和需要的參數(shù)是不同的,這里以實(shí)現(xiàn)三角形和正方形為例進(jìn)行說明。
CTriangle類描述三角形類信息,CSquare類描述正方形類信息,CGraphFactory類負(fù)責(zé)創(chuàng)建不同的幾何對象,它由GreateGraph函數(shù)根據(jù)不同的參數(shù),選擇性的實(shí)例化幾何對象。通過CGraphFactory類工廠用戶可以不關(guān)心具體對象是如何創(chuàng)建的,只需要告訴類工廠,需要創(chuàng)建什么類型的幾何圖形即可,UML類圖如下。
下面給出簡單工廠的定義:
簡單工廠模式(Simple Factory Pattern):定義一個工廠類,它可以根據(jù)參數(shù)的不同返回不同類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類;因?yàn)閯?chuàng)建實(shí)例的類方式是靜態(tài)方法,又被稱為靜態(tài)工廠方法(Static Factory Method)模式,它屬于類創(chuàng)建型模式。
具體代碼
主體代碼
#include "stdafx.h" using namespace std; typedef enum {EN_DRAW_SQUARE = 0,EN_DRAW_TRIANGLE, }ENUM_DRAW_TYPE;#define SAFE_DELETE_PTR(p) if ((p) != NULL)\ { \delete p;\p = NULL;\ } //圖形基類 class CGraph { public:CGraph(){}virtual ~CGraph(){} public:virtual void Draw() = 0;virtual void Erase() = 0; }; //正方形 class CSquare:public CGraph { public:CSquare():m_width(10){ cout << "完成正方形對象創(chuàng)建" << endl;}~CSquare(){} public:virtual void Draw(){cout << "繪制正方形" << endl;}virtual void Erase(){cout << "清除繪正方形" << endl;} private:int m_width;//正方形的獨(dú)有參數(shù) };//三角形 class CTriangle:public CGraph { public:CTriangle():m_bottom(10),m_high(12){cout << "完成三角形對象創(chuàng)建" << endl;}~CTriangle(){} public:virtual void Draw(){cout << "繪制三角形" <<endl;}virtual void Erase(){cout << "清除三角形" << endl;}private:int m_bottom; //底int m_high; //高 };//圖形創(chuàng)建工廠 class CGraphFactory { public://根據(jù)參數(shù)創(chuàng)建不同的對象static CGraph * CreateGraph(ENUM_DRAW_TYPE type){CGraph * pGraph = NULL;switch(type){case EN_DRAW_SQUARE:{pGraph = new CSquare();break;}case EN_DRAW_TRIANGLE:{pGraph = new CTriangle();break;}default:break;}return pGraph;} };客戶端代碼
//簡單工廠方法CGraph *pGraph = NULL;cout <<"請求創(chuàng)建三角形:"<< endl;pGraph = CGraphFactory::CreateGraph(EN_DRAW_TRIANGLE);if (pGraph != NULL){pGraph->Draw();pGraph->Erase();SAFE_DELETE_PTR(pGraph);}cout << endl <<"請求創(chuàng)建正方形:"<< endl;pGraph = CGraphFactory::CreateGraph(EN_DRAW_SQUARE);if (pGraph != NULL){pGraph->Draw();pGraph->Erase();SAFE_DELETE_PTR(pGraph);}運(yùn)行結(jié)果
簡單工廠模式總結(jié)
優(yōu)點(diǎn):
通過工廠類用戶不需要關(guān)心類對象的具體創(chuàng)建過程,使得對象的創(chuàng)建和使用分離,屏蔽了對象創(chuàng)建和初始化過程,方面用戶使用;
不足:
主要的不足從以下方面展開:
1. 工廠類負(fù)責(zé)一系列對象的創(chuàng)建,工廠類職責(zé)不單一;若處理不當(dāng),影響面比較大。
2. 如果每個類創(chuàng)建過程中需要涉及復(fù)雜的初始化和相關(guān)準(zhǔn)備,會造成工廠類邏輯復(fù)雜,不利于擴(kuò)展和維護(hù)。
3. 若需要新增其他對象創(chuàng)建,需要修改靜態(tài)函數(shù)的分支判斷,違背了“開放擴(kuò)展,關(guān)閉修改”的原則。
適用場合:
參考資料:
http://blog.csdn.net/LoveLion/article/details/9300731
轉(zhuǎn)載于:https://www.cnblogs.com/jinxiang1224/p/8468220.html
總結(jié)
以上是生活随笔為你收集整理的c++设计模式之简单工厂模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache2 httpd.conf 配
- 下一篇: 实战c++中的vector系列--vec