一起来学设计模式(2)——简单工厂模式

来源:互联网 发布:c语言取反!用法 编辑:程序博客网 时间:2024/05/29 14:57

其实,在GoF的23种设计模式中,并没有简单工厂模式这种说法,为了和工厂模式 、抽象工厂模式逐一对比,我们还是先从简单工厂模式说起。

“工厂”即用来生产“产品”,考虑以下需求:

我需要通过一个创建一个苹果,或者是创建一个,或者是创建一个。

在上边的需求中,这个可以创建苹果、梨、香蕉的类即为简单工厂类。同时,苹果、梨、香蕉都为水果,可以继承自水果类。设计如下:

代码如下:

/*** @file SimpleFactory.h* @brief * @author Don Hao* @date 2011-9-1 15:20:40* @version * <pre><b>copyright: </b></pre>* <pre><b>email: </b>hao.limin@gmail.com</pre>* <pre><b>company: </b>http://blog.csdn.net/donhao</pre>* <pre><b>All rights reserved.</b></pre>* <pre><b>modification:</b></pre>* <pre>Write modifications here.</pre>*/#ifndef _SIMPLEFACTORY_H#define _SIMPLEFACTORY_H#include <iostream>#include <string>class Fruit{public:    Fruit()    {    }    virtual ~Fruit()    {    }};class Apple: public Fruit{public:    Apple()    {        std::cout << "Apple" << std::endl;    }    virtual ~Apple()    {    }};class Pear : public Fruit{public:    Pear()    {        std::cout << "Pear" << std::endl;    }    virtual ~Pear()    {    }};class Banana : public Fruit{public:    Banana()    {        std::cout << "Banana" << std::endl;    }    virtual ~Banana()    {    }};class SimpleFactory{public:    SimpleFactory()    {    }    ~SimpleFactory()    {    }    Fruit* createFruit(std::string str)    {        if ("Apple" == str)        {            return new Apple();        }        if ("Pear" == str)        {            return new Pear();        }        if ("Banana" == str)        {            return new Banana();        }        else        {            std::cout << "Not Support" << std::endl;            return NULL;        }    }};#endif /**< _SIMPLEFACTORY_H */
/*** @file SimpleFactory.cpp* @brief * @author Don Hao* @date 2011-9-1 15:20:39* @version * <pre><b>copyright: </b></pre>* <pre><b>email: </b>hao.limin@gmail.com</pre>* <pre><b>company: </b>http://blog.csdn.net/donhao</pre>* <pre><b>All rights reserved.</b></pre>* <pre><b>modification:</b></pre>* <pre>Write modifications here.</pre>*/#include "SimpleFactory.h"void main(){    SimpleFactory sf;    sf.createFruit("Apple");    sf.createFruit("Pear");    sf.createFruit("Banana");    sf.createFruit("Watermelon");}


为了紧凑起见,类的定义放到了头文件中。

通过SimpleFactory可以创建不同的水果,其有以下几个明显的特点:

1. 通过一种标识(比如字符串或数字)来判断是创建何种产品。上边的示例中,通过传入的字符串来判断是创建Apple还是创建Pear等

2. 当需要增加一种新的类型的产品时,需要修改工厂方法