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

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

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

#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下编程常用到的头文件。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值