C++设计模式(1)-工厂模式

       最近在看设计模式,结合这三年的工作经验,这次看了设计模式之后有种豁然开郞的感觉,印象非常深刻,并且在脑海中呈现用与不用的明显不同之处。

工厂模式属于创建型模式,大致可以分为三类:简单工厂模式、工厂方法模式、抽象工厂模式。首先来介绍第一种,简单工厂模式,举个事例:图形

数据库中有个存放图形的容器,当然创建图形的地方的有很多,这时就可以用简单工厂模式了。先上UML图:

代码: 

#pragma once

//图形类型
enum emShapeType 
{
	LINE,		//线
	CIRCLE,		//圆
	RECTANGLE	//矩形
};
//图形基类
class CShape
{
public:
	CShape(void){}
	~CShape(void){}
};

//直线
class CLine : public CShape
{
public:
	CLine(void){}
	~CLine(void){}
};

//圆
class CCircle : public CShape
{
public:
	CCircle(void){}
	~CCircle(void){}
};

//矩形
class CRectangle : public CShape
{
public:
	CRectangle(void){}
	~CRectangle(void){}
};
#pragma once
#include "Shape.h"
//工厂类
class CFactory
{

public:
	CFactory(void){}
	~CFactory(void){}
public:
	//根据类型来创建图形
	//在实际应用中我更喜欢用静态函数
	static CShape* CreateShape(emShapeType emType)
	{
		switch (emType)
		{
		    case LINE:
				return new CLine;
			case CIRCLE:
				return new CCircle;
			case RECTANGLE:
				return new CRectangle;
			default:
				return NULL;
		}
	}
};

#include <iostream>
#include "Factory.h"
#include "DataBase.h"
using namespace std;
void main()
{
	//用工厂
	CDataBase* pData = new CDataBase;
	pData->AddShape(CFactory::CreateShape(RECTANGLE));
	//不用工厂
	CLine* pLine = new CLine();
	pData->AddShape(pLine);
	CRectangle* pRect = new CRectangle;
	pData->AddShape(pRect);
}


     从应用的角度来看,用与不用工厂的优缺点一目了然,用工厂的优点:1、不会管具体的子类,只对有原型(基类)操作。2、减少错误概率的发生,即使有错也是一改全改。例如现在项目经理要求只要是有指针的地方都要加个空指针判断。抓狂乖乖滴,如果没有用工厂的话,可想而之,脑力活动变成体力活动了。大哭

      当然,简单工厂模式也有它的缺点,它违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。于是,工厂方法模式出现了。所谓工厂方法模式,是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。UML图:

代码如下:

//类工厂基类
class CFactoryBase
{
public:
	CFactoryBase(){}
	~CFactoryBase(){}
public:
	virtual CShape* CreateShape() = 0 ;
};

//线类工厂基地
class CLineFactory : public CFactoryBase
{
public:
	CLineFactory();
	~CLineFactory();
public:
	virtual CShape* CreateShape()
	{
		return new CLine();
	}
};

//圆类工厂基地
class CCirlceFactory : public CFactoryBase
{
public:
	CCirlceFactory(){}
	~CCirlceFactory(){}
public:
	virtual CShape* CreateShape()
	{
		return new CCircle();
	}
};

//矩形类工厂基地
class CRectFactory : public CFactoryBase
{
public:
	CRectFactory(){}
	~CRectFactory(){}
public:
	virtual CShape* CreateShape()
	{
		return new CRectangle();
	}
};
#include <iostream>
#include "Factory.h"
#include "DataBase.h"
using namespace std;
void main()
{
	//用简单工厂模式
	CDataBase* pData = new CDataBase;
	pData->AddShape(CFactory::CreateShape(RECTANGLE));

	//不用工厂
	CLine* pLine = new CLine();
	pData->AddShape(pLine);
	CRectangle* pRect = new CRectangle;
	pData->AddShape(pRect);

	//用工厂模式
	CLineFactory* pLineFac = new CLineFactory();
	pData->AddShape(pLineFac->CreateShape());
	CCirlceFactory* pCirFac = new CCirlceFactory();
	pData->AddShape(pCirFac->CreateShape());
}

 

     从应用的角度来看个人感觉没有简单工厂模式直观,当图形的种类越来越多时工厂类也会增多。还有一个抽象工厂模式,我不打算在这里贴出相关代码,它与工厂模式很像,只不过在类工厂基类中添加类似于virtual CShape* CreateShape() = 0 一样的语句而已。

      至此工厂模式介绍完毕,如有不妥之处还请大家多多指点。吐舌头源代码地址:http://download.csdn.net/detail/m_x_c/4742689

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值