这是哪种设计模式:工厂方法还是抽象工厂。

5

我正在阅读关于创建型设计模式的内容,但是在 Factory、Abstract Factory 和 Factory method 之间搞混了自己。

下面是一段代码片段。请问这是哪个模式?如果可能的话,有什么改动可以使它符合其他模式的要求吗?

#include "iostream.h"

#define QUIT 2

class Shape {
public:
    virtual void draw() = 0;
};

class Circle : public Shape {
public:
    void draw() {
        cout << "circle : draw" << endl;
    }
};
class Square : public Shape {
public:
    void draw() {
        cout << "square : draw" << endl;
    }
};

class Factory {
public:
    virtual Shape* createInstance(int id) = 0;
};

class SimpleShapeFactory : public Factory {
public:
    Shape* createInstance( int id) {
        if(id == 0)
            return new Circle;
        else if(id == 1)
            return new Square;
        else 
            return new Circle; //as a default
    }
};

int main() {
    Factory* factory = new SimpleShapeFactory();
    int choice = 0;
    Shape* shape;

    do
    {
        cout<<"\n 0. Circle";
        cout<<"\n 1. Square";
        cout<<"\n 2. Quit";
        cout<<"\n Enter your choice : ";

        cin>>choice;

        if(choice == QUIT)
            break;

        shape = factory->createInstance(choice);
        shape->draw();
    } while (choice !=QUIT);
}
2个回答

4
这不是GOF的创造模式之一。它是抽象工厂模式的变体,有时称为参数化工厂模式。参数化工厂根据传递给 create 方法的参数(通常是 ID 或类型指定符)创建不同的对象。
在您的示例中,GOF工厂方法可能如下所示(仅为示例...无意义...)。
struct AreaCalculator {
    virtual double calculateArea() = 0;
};

struct CircleCalculator {
    CircleCalculator(const Circle& circle);
    double calculateArea() override;
};

struct Shape {
    virtual void draw() = 0;

    // This is the factory method:
    virtual std::unique_ptr<AreaCalculator> createCalculator() = 0;
};

struct Circle : Shape {
    void draw() override {
        cout << "circle : draw" << endl;
    }

    std::unique_ptr<AreaCalculator> createCalculator() {
        return make_unique<AreaCalculator>(*this);
    }
};

一个GOF抽象工厂看起来会像这样:
struct Circle {
    virtual void draw() = 0;
};

struct StdoutCircle : Circle {
    void draw() override {
        cout << "circle : draw" << endl;
    }
};

struct Win32Circle : Circle {
    void draw() override {
        // ....
    }
};


struct ShapeFactory {
    virtual std::unique_ptr<Circle> createCircle() = 0;
    virtual std::unique_ptr<Rect> createRect() = 0;
};

struct StdoutShapeFactory : ShapeFactory {
    std::unique_ptr<Circle> createCircle() override {
        return make_unique<StdoutCircle>();
    }

    std::unique_ptr<Rect> createRect() override {
        // ...
    }
};

我不确定GOF,也没有读过它。我只是通过多个网站阅读有关工厂模式的内容。 - user1314305
@user1314305,我添加了两个GOF模式的示例。 - hansmaad
非常感谢您提供的示例。我已经粗略地浏览了一遍,但是并没有得出太多结论。然而,这是我的不足,您的回答没有任何问题。只是我需要花更多的时间去理解其中的差异。话虽如此,我将把您的回答标记为正确答案。 - user1314305

3

@Rakilbul:我正在查看您提供的链接,但仍然感到困惑,很难理解。正如您所建议的,它目前是抽象工厂的实现,您能否解释一下我可以进行哪些代码更改以使其成为工厂方法? - user1314305

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接