您的位置:首页 > 其它

设计模式——工厂模式(Factory)

2013-11-05 17:03 316 查看

1. 定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。




Product:负责定义产品的共性,实现对事物最抽象定义;
Creator:抽象创建类,也就是抽象工厂

ConcreteCreator:实现具体如何创建产品类

2. 优点

(1)良好的封装性,代码结构清晰

一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名(或约束字符串)就可以了,不用知道创建对象的艰辛过程,减少模块间的耦合。

(2)工厂方法模式的扩展性非常优秀。

在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以完成“拥抱变化”。例如在我们的例子中,需要增加一个棕色人种,则只需要增加一个BrownHuman类,工厂类不用任何修改就可完成系统扩展。

(3)屏蔽产品类

这一特点非常重要,产品类的实现如何变化,调用者都不需要关心,它只需要关心产品的接口,只要接口保持不表,系统中的上层模块就不要发生变化,因为产品类的实例化工作是由工厂类负责,一个产品对象具体由哪一个产品生成是由工厂类决定的。在数据库开发中,大家应该能够深刻体会到工厂方法模式的好处:如果使用JDBC连接数据库,数据库从MySql切换到Oracle,需要改动地方就是切换一下驱动名称(前提条件是SQL语句是标准语句),其他的都不需要修改,这是工厂方法模式灵活性的一个直接案例。

(4)工厂方法模式是典型的解耦框架

高层模块值需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特原则,我不需要的就不要去交流;

符合依赖倒转原则,只依赖产品类的抽象;

符合里氏替换原则,使用产品子类替换产品父类

3. 实例解析

设计一个绘制图元的程序

类图如下:

(注:图中Create箭头是我自己添加的,是依赖关系,应该用虚线,但是找不到虚线,特在此声明)



3.1 图元类

//IGeometry.h
#ifndef __IGEOMETRY_H__
#define __IGEOMETRY_H__

#include <iostream>

using std::cout;
using std::endl;

class IGeometry
{
public:
IGeometry()
{

}
virtual ~IGeometry()
{

}

virtual void Draw() = 0;
};
#endif

//XPoint.h
#ifndef __CXPOINT_H__
#define __CXPOINT_H__

#include "IGeometry.h"

class CXPoint:public IGeometry
{
public:
CXPoint(void);
~CXPoint(void);

void Draw();
};

#endif

#include "XPoint.h"

CXPoint::CXPoint(void)
{
}

CXPoint::~CXPoint(void)
{
}

void CXPoint::Draw()
{
cout<<"Draw Point."<<endl;
}


//XLine.h
#ifndef __CXLINE_H__
#define __CXLINE_H__

#include "IGeometry.h"

class CXLine :
public IGeometry
{
public:
CXLine(void);
~CXLine(void);

void Draw();
};

#endif

#include "XLine.h"

CXLine::CXLine(void)
{
}

CXLine::~CXLine(void)
{
}

void CXLine::Draw()
{
cout<<"Draw Line."<<endl;
}


3.2 工厂类:

#ifndef __IGEOMETRY_FACTORY_H__
#define __IGEOMETRY_FACTORY_H__

#include "IGeometry.h"
class IGeometryFactory
{
public:
IGeometryFactory()
{

}

virtual ~IGeometryFactory()
{

}

virtual IGeometry* Create() = 0;
};
#endif


#ifndef __CLINEfACTORY_H__
#define __CLINEfACTORY_H__

#include "IGeometryFactory.h"
#include "XLine.h"

class CLineFactory:public IGeometryFactory
{
public:
CLineFactory(void);
~CLineFactory(void);

IGeometry* Create();
};

#endif

#include "LineFactory.h"

CLineFactory::CLineFactory(void)
{
}

CLineFactory::~CLineFactory(void)
{
}

IGeometry* IGeometryFactory::Create()
{
return new CXLine();
}


#ifndef __CPOINTFACTORY_H__
#define __CPOINTFACTORY_H__

#include "IGeometryFactory.h"
#include "XPoint.h"

class CPointFactory:public IGeometryFactory
{
public:
CPointFactory(void);
~CPointFactory(void);

IGeometry* Create();
};

#endif

#include "LineFactory.h"

CLineFactory::CLineFactory(void)
{
}

CLineFactory::~CLineFactory(void)
{
}

IGeometry* IGeometryFactory::Create()
{
return new CXLine();
}


3.3 测试函数:

int main()
{
IGeometryFactory * p_factory;
IGeometry* p_geometry;

//draw point
p_factory = new CPointFactory();
p_geometry = p_factory->Create();
p_geometry->Draw();

//draw line
p_factory = new CLineFactory();
p_geometry = p_factory->Create();
p_geometry->Draw()

return 0;
}


代码非常简单,本来不想贴了,但是要有始有终不是……

4. 参考

[1] 工厂方法模式 http://www.cnblogs.com/cbf4life/archive/2009/12/20/1628494.html
注:原文采用java实现的,讲解的很不错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: