抽象工厂模式(Abstract Factory Pattern):是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
代码:
//-------------------------------------------------------
// 设计模式:抽象工程模式
//-------------------------------------------------------
#include "stdafx.h"
#include<iostream>
#include <cstring>
using namespace std;
//------------------------------------------------------------------------------------------
class Shape
{
public:
void virtual draw()=0;
};
class Rec : public Shape
{
public:
void draw()
{
cout << "Rec.draw()"<< endl;
}
};
class Square : public Shape
{
public:
void draw()
{
cout << "Square.draw()"<< endl;
}
};
class Circle : public Shape
{
public:
void draw()
{
cout << "Circle.draw()"<< endl;
}
};
//------------------------------------------------------------------------------------------
class Color
{
public:
void virtual fill() = 0;
};
class Red :public Color
{
public:
void fill()
{
cout << "Color.Red()" << endl;
}
};
class Green :public Color
{
public:
void fill()
{
cout << "Color.Green()" << endl;
}
};
class Blue :public Color
{
public:
void fill()
{
cout << "Color.Blue()" << endl;
}
};
//-----------------------------------------------------------------------------
class AbstractFactory
{
public:
virtual Color* getColor(string color)=0;
virtual Shape* getShape(string shape)=0;
};
class ShapeFactory : public AbstractFactory
{
public:
Shape* getShape(string shape)
{
if (shape.empty())
{
return NULL;
}
if (shape.compare("Rec") == 0)
{
return new Rec();
}
if (shape.compare("Square") == 0)
{
return new Square();
}
if (shape.compare("Circle") == 0)
{
return new Circle();
}
return NULL;
}
Color* getColor(string color)
{
return NULL;
}
};
class ColorFactory : public AbstractFactory
{
public:
Color* getColor(string color)
{
if (color.empty())
{
return NULL;
}
if (color.compare("Red") == 0)
{
return new Red();
}
if (color.compare("Green") == 0)
{
return new Green();
}
if (color.compare("Blue") == 0)
{
return new Blue();
}
return NULL;
}
Shape* getShape(string shape)
{
return NULL;
}
};
class FactoryProducer
{
public:
AbstractFactory* getFactory(string choice)
{
if (choice.compare("SHAPE") == 0)
{
return new ShapeFactory();
}else if (choice.compare("Color") == 0)
{
return new ColorFactory();
}
return NULL;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
FactoryProducer factoryProducer;
AbstractFactory* shapeFactory = factoryProducer.getFactory("SHAPE");
Shape *shape1 = shapeFactory->getShape("Circle");
shape1->draw();
Shape *shape2 = shapeFactory->getShape("Square");
shape2->draw();
Shape *shape3 = shapeFactory->getShape("Rec");
shape3->draw();
//---------------------------------------------------------------------------
AbstractFactory *colorFactory = factoryProducer.getFactory("Color");
Color* color1 = colorFactory->getColor("Red");
color1->fill();
Color* color2 = colorFactory->getColor("Blue");
color2->fill();
Color* color3 = colorFactory->getColor("Green");
color3->fill();
system("PAUSE");
return 0;
}