抽象工厂模式(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; }