Key:抽象工厂模式可以产生新的系列产品,并控制产品的生产过程。
这里有必要和工厂方法这个设计模式做一些比较。工厂方法和抽象工厂并不是谁更高级,虽然听起来抽象工厂比工厂方法高级点。它们各有长处,各有短处。工厂方法在增加产品种类上比较方便,增加一个具体工厂和一个具体产品即可。而在产生系列产品上比较不方便,可能会造成类的爆炸。而抽象工厂在产生系列产品上比较方便,但是如果增加产品的种类,不得不去在修改抽象工厂类。像空间主页或皮肤,一次替换多个元素,就很像抽象工厂模型。其实和工厂模式相比,就是在工厂里面多了几个抽象的产品生产方法,而工厂方法模型里面只有一个抽象的产品生产方法。
例如为了产生交通工具和食品两个产品,而这两个产品有一定关系,需要结合在一起使用的时候,可以利用抽象工厂设计模式。
代码如下:
#include<iostream>
using namespace std;
class Food
{
public:
virtual void showName() = 0;
};
class Vehicle
{
public:
virtual void run() = 0;
};
class AbstractFactory
{
public:
virtual Food *createFood() = 0; //这里注意Food类一定要声明在前面,否则编译器找不到Food类型
virtual Vehicle *createVehicle() = 0;
};
class Apple:public Food
{
public:
void showName()
{cout<<"An apple!"<<endl;};
};
class Orange:public Food
{
public:
void showName()
{cout<<"An orange"<<endl;};
};
class Car:public Vehicle
{
public:
void run()
{cout<<"car run!"<<endl;};
};
class Plane:public Vehicle
{
public:
void run()
{cout<<"plane run!"<<endl;};
};
class MyFactory1:public AbstractFactory
{
public:
Food *createFood()
{return new Apple();};
Vehicle *createVehicle()
{return new Car();};
};
class MyFactory2:public AbstractFactory
{
public:
Food *createFood()
{return new Orange();};
Vehicle *createVehicle()
{return new Plane();};
};
int main()
{
//AbstractFactory *factory = new MyFactory1(); //只需要替换一个工厂,就可以替换工厂产生的系列的产品
AbstractFactory *factory = new MyFactory2();
Food *food = factory->createFood();
food->showName();
Vehicle *vehicle = factory->createVehicle();
vehicle->run();
return 0;
}