今天开始看了下设计模式的书,开始就遇到了工厂模式的概念,这里简单谈下对它的一点理解。
1.为什么要有工厂模式?
假设我们要在屏幕上实现画画的功能,以下面这个描述过程为例:
void main() { int integerA = 10; int * const pA = &integerA; *pA = 20; //正确 pA ++; //错误 }
在上述例子中,我们写的代码暴露在了主控模块当中,这样一来可能就会难以理清主控模块中的程序代码逻辑顺序,不方便程序的维护与拓展。所以我们需要有一种方法来屏蔽这些代码,减小主控模块逻辑上的复杂性,以便方便主控模块的编写者。工厂模式就是许多实现这种目的方法中的一种。
2.简单工厂模式。
书上好像说工厂模式有三种,即简单工厂模式、工厂方法模式与抽象工厂模式。看起来有些玄乎,那我们先用一下简单工厂模式来重构一下上面的代码,以便理解工厂模式的含义。
void main() { int integerA = 10; int * const pA = &integerA; *pA = 20; //正确 pA ++; //错误 }
在这个例子中,我们的CDraw * brush好像就是被CDrawFactory生产出来一样,所以这样的封装方法就叫工厂模式。当然它还可以生产出画点的、划线的以及画矩形的刷子。
3.工厂方法模式
在上面的例子中,我们发现若是我们需要增加一种画图形的方法,就需要修改CDrawFactory内部的代码,即增加相应的条件分支,这无疑破坏了类的封装性。为了再增加需求的时候尽量不修改原来内部的代码,而仅仅是在外部进行宏观的修改工作,我们则需要使用工厂方法模式继续重构它。
#include <iostream> #include <string> /** 画画对象基类 */ class CDraw { public: virtual void draw() = 0; }; class CDrawDot : public CDraw { public: void draw() { std::cout << "点" << std::endl; } }; class CDrawLine : public CDraw { public: void draw() { std::cout << "线" << std::endl; } }; class CDrawSquare : public CDraw { public: void draw() { std::cout << "矩形" << std::endl; } }; class CDrawCircle : public CDraw { public: void draw() { std::cout << "圆形" << std::endl; } }; /** 画画类工厂基类 */ class CDrawFactory { public: virtual CDraw* createDraw() = 0; }; class CDrawDotFactory : public CDrawFactory { public: CDraw* createDraw() { return new CDrawDot(); } }; class CDrawLineFactory : public CDrawFactory { public: CDraw* createDraw() { return new CDrawLine(); } }; class CDrawSquareFactory : public CDrawFactory { public: CDraw* createDraw() { return new CDrawSquare(); } }; class CDrawCircleFactory : public CDrawFactory { public: CDraw* createDraw() { return new CDrawCircle(); } }; void main() { CDraw * brush; CDrawFactory * myFactory; /** 创建一个生产CDrawCircle的工厂类 */ myFactory = new CDrawCircleFactory(); if ( myFactory ) { brush = myFactory->createDraw(); if ( brush ) { brush->draw(); delete brush; } delete myFactory; } }
这里简单工厂模式又写了四种工厂类来继承CDrawFactory,它们分别可以生产不同类型的CDraw。这样在增加画画方式的时候就可以只在外部添加相应的CDrawFactory类型与CDraw类型了。
4.抽象工厂模式
抽象工厂模式从名字上听起来就很抽象,其实它只是工厂方法模式的推广,即工厂方法模式只能生产一种产品,而抽象工厂模式可以生产多种产品。比如上例CDrawFactory只能生产CDraw类型的指针,我们也可以通过增加CDrawFactory的成员函数(方法)来生产其它类型的指针。
设计模式今天才开始看,对它的理解还不是很深刻,看来只有多写写代码来体会这些设计工作的作用了。