您的位置:首页 > 编程语言 > C语言/C++

设计模式C++版:第八式工厂方法模式

2016-09-03 10:37 204 查看
我们已经介绍了“简单”工厂,这才是实实在在的工厂模式。下面是关于她的简单定义和代码示例:

工厂模式定义:创建一个用于创建对象的接口,让子类决定实例化哪一个子类,并把这种实例化延迟到它的子类。

#include <iostream>
class GoodMan
{
public:

virtual	~GoodMan(){ }

virtual void kindhearted()
{
std::cout << "好人善良" << std::endl;
}

virtual void helpohters()
{
std::cout << "好人帮人" << std::endl;
}

private:

};

class Undergraduate :public GoodMan
{
public:
void kindhearted()
{
std::cout << "学生善良" << std::endl;
}

void helpohters()
{
std::cout << "学生们帮助他人" << std::endl;
}

};

class Volunteer :public GoodMan
{
public:
void kindhearted()
{
std::cout << "自愿者善良" << std::endl;
}

void helpohters()
{
std::cout << "自愿者帮助他人" << std::endl;
}
};

/////////////////////工厂方法///////////////

class IFactory       //接口类
{
public:
IFactory() :m_goodman(nullptr){}
virtual GoodMan* createGoodMan(){ return m_goodman; }
virtual ~IFactory()
{
if (m_goodman!=nullptr)
{
delete m_goodman;
}
}
protected:
GoodMan * m_goodman;
};

class UndergraduateFactory :public IFactory
{
public:
GoodMan* createGoodMan()
{
m_goodman = new Undergraduate;
return m_goodman;
}

};

class VolunteerFactory :public IFactory
{
public:
GoodMan *createGoodMan()
{
m_goodman = new Volunteer;
return m_goodman;
}

};

int main()
{
IFactory *factory = new UndergraduateFactory;     //创建具体工厂
GoodMan *student = factory->createGoodMan();      //创建实际对象

student->helpohters();
student->kindhearted();

delete factory;
return 0;
}


最后再说一下,如果我们创建的较多的类,比如我们认为警察都是好人,我们需要再添加一个警察工厂和一个具体的警察类。这样的改动我们需要增加的代码量变大了。另外客户端需要知道更多的类型了,也自然要包含更多的头文件。如果一个正常文件,文档的第一屏全部的三四十行都是头文件,是我的话,看到这种代码估计又要感觉不爽了。当然这种情况可以使用一些小技巧规避。比如添加一个header.h,把需要的头文件都包含进去,而后其他的文件只需要调用这个header.h 即可。这种方法大家都见过,尤其适用vs编程时更是常见,这么一说估计很多人都明白了,对的,就是那个经常出现的stdfx.h,它几乎包含了所有windows下编程常用到的头文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: