參考:http://www.runoob.com/design-pattern/abstract-factory-pattern.htmlhtml
C++代碼實現:(爲了簡單演示,這些類的定義都在一個頭文件中,具體使用的時候,應該分開文件存放)ios
#include <iostream> using namespace std; class Shape{ public: virtual void draw() = 0; }; class Rectangle : public Shape{ public: void draw(){ cout << "Inside Rectangle::draw() method." << endl; } }; class Square : public Shape{ public: void draw(){ cout << "Inside Square::draw() method." << endl; } }; class Circle : public Shape{ public: void draw(){ cout << "Inside Circle::draw() method." << endl; } }; class Color{ public: virtual void fill() = 0; }; class Red : public Color{ public: void fill(){ cout << "Inside Red:fill() methon." << endl; } }; class Green : public Color{ public: void fill(){ cout << "Inside Green:fill() methon." << endl; } }; class Blue : public Color{ public: void fill(){ cout << "Inside Blue:fill() methon." << endl; } }; class AbstractFactory{ public: virtual Color* getColor(string color) = 0; virtual Shape* getShape(string shape) = 0; }; class ShapeFactory : public AbstractFactory{ public: Shape* getShape(string shapeType){ if (shapeType.empty()) { return NULL; } if (shapeType == "CIRCLE") { return new Circle(); } else if (shapeType == "RECTANGLE") { return new Rectangle(); } else if (shapeType == "SQUARE") { return new Square(); } return NULL; } Color* getColor(string color){ return NULL; } }; class ColorFactory : public AbstractFactory{ public: Shape* getShape(string shapeType){ return NULL; } Color* getColor(string color){ if (color.empty()) { return NULL; } else if (color == "RED") { return new Red(); } else if (color == "Green") { return new Green(); } else if (color == "BLUE") { return new Blue(); } return NULL; } }; class FactoryProducer { public: static AbstractFactory* getFactory(string choice){ if (choice == "SHAPE") { return new ShapeFactory(); } else if (choice == "COLOR") { return new ColorFactory(); } return NULL; } };
測試:ide
#include "AbstractFactory.h" int main() { //獲取形狀工廠 AbstractFactory* shapeFactory = FactoryProducer::getFactory("SHAPE"); //獲取形狀爲Circle的對象 Shape* shape1 = shapeFactory->getShape("CIRCLE"); //調用Circle的draw方法 shape1->draw(); //獲取形狀爲Rectangle的對象 Shape *shape2 = shapeFactory->getShape("RECTANGLE"); //調用Rectangle的draw方法 shape2->draw(); //獲取形狀爲Square的對象 Shape *shape3 = shapeFactory->getShape("SQUARE"); //調用Square的draw方法 shape3->draw(); //獲取顏色工廠 AbstractFactory* colorFactory = FactoryProducer::getFactory("COLOR"); //獲取顏色爲Red的對象 Color *color1 = colorFactory->getColor("RED"); //調用Green的fill方法 color1->fill(); //獲取顏色爲Green的對象 Color *color2 = colorFactory->getColor("Green"); //調用Red的fill方法 color2->fill(); //獲取顏色爲Blue的對象 Color *color3 = colorFactory->getColor("BLUE"); //調用Blue的fill方法 color3->fill(); getchar(); return 0; }
運行結果:測試