今天开始看了下设计模式的书,开始就遇到了工厂模式的概念,这里简单谈下对它的一点理解。
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的成员函数(方法)来生产其它类型的指针。
设计模式今天才开始看,对它的理解还不是很深刻,看来只有多写写代码来体会这些设计工作的作用了。
1331

被折叠的 条评论
为什么被折叠?



