现在的位置: 首页 > 综合 > 正文

工厂模式的理解

2013年07月05日 ⁄ 综合 ⁄ 共 2055字 ⁄ 字号 评论关闭

      今天开始看了下设计模式的书,开始就遇到了工厂模式的概念,这里简单谈下对它的一点理解。

      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的成员函数(方法)来生产其它类型的指针。 

      设计模式今天才开始看,对它的理解还不是很深刻,看来只有多写写代码来体会这些设计工作的作用了。

 

抱歉!评论已关闭.