设计模式——工厂模式(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实现的,讲解的很不错。
相关文章推荐
- java设计模式之一工厂模式(Factory Method)
- java设计模式之一工厂模式(Factory Method)
- 设计模式--工厂模式Factory(创建型)
- 设计模式(1)-工厂模式(Factory)
- java设计模式之一工厂模式(Factory Method)
- java设计模式之一工厂模式(Factory Method)
- 设计模式(四)-工厂模式(Factory Method Pattern/Factory Pattern)——将实例的生成交给子类
- java设计模式之 工厂模式Factory
- 设计模式-工厂模式(Factory Pattern)
- 工厂模式(Factory)-设计模式(一)
- java设计模式之一工厂模式(Factory Method)
- java设计模式之一工厂模式(Factory Method)
- 设计模式——工厂模式(Factory)
- 设计模式-工厂模式(Factory)
- java设计模式之一工厂模式(Factory Method)
- java设计模式之一工厂模式(Factory Method)
- Java设计模式——工厂模式(Factory Pattern)
- java设计模式之一工厂模式(Factory Method)
- java设计模式之一工厂模式(Factory Method)
- 设计模式学习——工厂模式(Factory Pattern)