首先看简单工厂模式
此模式的职责就是负责创建其他类的的实例,通常是一类对象
如下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在,所以任何水果都可以生产出来,而且是一致的生产
如果一层抽象解决不了问题,那就在增加一层!