最近在看设计模式,结合这三年的工作经验,这次看了设计模式之后有种豁然开郞的感觉,印象非常深刻,并且在脑海中呈现用与不用的明显不同之处。
工厂模式属于创建型模式,大致可以分为三类:简单工厂模式、工厂方法模式、抽象工厂模式。首先来介绍第一种,简单工厂模式,举个事例:图形
数据库中有个存放图形的容器,当然创建图形的地方的有很多,这时就可以用简单工厂模式了。先上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