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