c++设计模式之简单工厂模式
来源:互联网 发布:西安爱知中学学费 编辑:程序博客网 时间:2024/06/01 22:52
模拟场景
要求使用简单工厂模式设计一个可以创建不同几何形状(如矩形、圆形、三角形)的绘图工具,每个几何图形都具有绘制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
- C#--设计模式之简单工厂模式
- 设计模式之简单工厂,工厂方法模式(c++)
- 设计模式 之简单工厂+ 工厂模式
- 设计模式之简单工厂模式(使用C++)
- C#--简单工厂设计模式
- 设计模式之简单工厂设计模式
- 设计模式之简单工厂模式,工厂模式,策略模式
- 设计模式 之 简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂
- 设计模式之简单工厂.
- 设计模式之简单工厂
- NSMutableArray使用中忽视的问题
- byte.int类型数的计算
- Pomelo环境搭建完整攻略
- php 通过file_put_contents 实现记录sql语句
- 图论模型总结
- c++设计模式之简单工厂模式
- 二叉树的非递归遍历整理
- Windows shell 扩展编程教程详解
- HDU 6043 KazaQ's Socks
- Bitmap介绍
- 时间序列分析的matlab统计量函数1
- ZOJ
- 最讨厌心灵鸡汤 所有失败最终都是人不行
- 关联式容器之底层红黑树