一个工厂模式的浅析

首先看简单工厂模式

此模式的职责就是负责创建其他类的的实例,通常是一类对象

如下fruit -> banana     fruit -> apple

#include <iostream>
using namespace std;

class Fruit
{
public:
	virtual void getFruit() = 0;

};
class banana: public Fruit
{
public:
	virtual void getFruit()
	{
		cout << "banana" <<endl;
	}

};
class Apple : public Fruit
{
public:
	virtual void getFruit()
	{
		cout << "apple" << endl;
	}
};
class Factory
{
public:
	Fruit* create_fruit(char* s)  //每增加一种类型  都需要 修改这里的代码 不符合开闭原则
	{
		if (strcmp(s, "banana") == 0)
		{
			return new banana();
		}
		else if (strcmp(s, "apple") == 0)
		{
			return new Apple();
		}
		else{
			return NULL;
		}
	}
};


int main()
{
	Factory* f = new Factory();
	Fruit* fruit = f->create_fruit("banana");
	fruit->getFruit();
	delete fruit;

	fruit = f->create_fruit("apple");
	fruit->getFruit();
	delete fruit;

	system("pause");
	return 0;
}

缺点 就是 当有更多种类的水果时,都需要修改工厂类的源代码 (但是简单易实现)


再看看 真正的工厂


#include <iostream>
using namespace std;

class Fruit
{
public:
	virtual void getFruit() = 0;

};
class Banana : public Fruit
{
public:
	virtual void getFruit()
	{
		cout << "banana" << endl;
	}

};
class Apple : public Fruit
{
public:
	virtual void getFruit()
	{
		cout << "apple" << endl;
	}
};

class abs_Factory  //这是一个抽象的工厂
{
public:
	virtual Fruit* create_product() = 0;

};



class Banana_Factory:public abs_Factory  //这是一个生产banana的工厂
{
public:
	virtual Fruit* create_product()  
	{
		return new Banana;
	}
};

//通过增加代码 来实现功能增强  符合开闭原则
class Apple_Factory :public abs_Factory    //这是一个生产apple的工厂
{ 
public:
	virtual Fruit* create_product()  
	{
		return new Apple;
	}
};
//如果还需要什么水果 ,通过增加 代码
// 先创建一种水果  fruit->truth_fruit
// 再创建一种生产这种水果的工厂 abs_factory-> ctreat_thruth_fruit
// 开始愉快的生产水果

int main()
{
	abs_Factory *factory =NULL;
	Fruit* fruit = NULL;

	factory = new Banana_Factory;
	fruit = factory->create_product();
	fruit->getFruit();

	factory = new Apple_Factory;
	fruit = factory->create_product();
	fruit->getFruit();

	delete factory;
	delete fruit;
	system("pause");
	return 0;
}

从这里,就可以看出一点面向接口编程的味道了,因为有这个抽象factory在,所以任何水果都可以生产出来,而且是一致的生产

如果一层抽象解决不了问题,那就在增加一层!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章