设计模式之工厂模式 练习

设计模式中 最基本的工厂模式

感觉就是根据输入的类型决定选择何种类与进行何种操作。

跟面向过程中输入1则执行func1();输入2则执行func2()基本一致的想法

 

#include <iostream>

using namespace std;


enum eShoeType{ leather = 0,rubber};

class CShoe{
public:
	virtual void What() = 0;
};

class CLeatherShoe : public CShoe
{
public:
	void What() {cout << "I am leather shoe." << endl;}
};

class CRubberShoe : public CShoe
{
public:
	void What() {cout << "I am rubber shoe." << endl;}
};

class CShoeFactory
{
public:
	CShoe* GetShowInstance(eShoeType type)
	{
		cout << "工厂生产鞋子ing..." << endl;
		switch(type)
		{
		case leather:
			return new CLeatherShoe();
		case rubber:
			return new CRubberShoe();
		default:
			return NULL;
		}
	}
};

void TestWithCpp()
{
	CShoeFactory factory;
	CShoe* pShoe = NULL; 


	pShoe = factory.GetShowInstance(leather);
	if(NULL != pShoe)
	{
		pShoe->What();
		delete pShoe;
		pShoe = NULL;
	}
	

 	pShoe = factory.GetShowInstance(rubber);
	if(NULL != pShoe)
	{
		pShoe->What();
		delete pShoe;
		pShoe = NULL;
	}
}
////////////////////////////////////////////////////////
typedef struct SHOE{
	int type;
	void (*print_shoe)(struct SHOE*);
}Shoe;

void PrintLeatherShoe(Shoe* pShoe)
{
	if(NULL != pShoe)
		printf("I am leather shoe \n");
}

void PrintRubberShoe(Shoe* pShoe)
{
	if(NULL != pShoe)
		printf("I am rubber shoe \n");
}


Shoe* FactoryShoe(int type)
{
	Shoe* pShoe = NULL;

	pShoe = (Shoe*)malloc(sizeof(Shoe));
	if(NULL == pShoe)
		return NULL;
	
	memset(pShoe,0,sizeof(Shoe));

	if(leather == type)
	{
		pShoe->type = type;
		pShoe->print_shoe = PrintLeatherShoe;
	}else if( rubber == type)
	{
		pShoe->type = type;
		pShoe->print_shoe = PrintRubberShoe;
	}else
	{
		free(pShoe);
		pShoe = NULL;
		return NULL;
	}
	return pShoe;
}



void TestWithC()
{
	printf("\n\n 测试C版本工厂模式\n");


	Shoe* pShoe = FactoryShoe(leather);
	if(NULL != pShoe)
	{
		pShoe->print_shoe(pShoe);
		free(pShoe);
		pShoe = NULL;
	}

	pShoe = FactoryShoe(rubber);
	if(NULL != pShoe)
	{
		pShoe->print_shoe(pShoe);
		free(pShoe);
		pShoe = NULL;
	}

	pShoe = FactoryShoe(994);
	if(NULL != pShoe)
	{
		pShoe->print_shoe(pShoe);
		free(pShoe);
		pShoe = NULL;
	}


}


////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
	TestWithCpp();
	TestWithC();
	return 0;
}

我的 c++ 交流群 324164944 

 

posted on 2014-07-28 11:29  itdef  阅读(615)  评论(1编辑  收藏  举报

导航