抽象工廠模式C++實現

參考: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;
}

運行結果:測試

相關文章
相關標籤/搜索