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

1. 定义

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

clip_image004

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实现的,讲解的很不错。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值