2. Which design pattern is used in the following code?

#include <cassert>
#include <string>

struct Point
{
    Point()
        : x(0.0)
        , y(0.0)
    { }

    Point(const double &a, const double &b)
        : x(a)
        , y(b)
    { }

    Point& operator+=(const Point &a)
    {
        this->x += a.x;
        this->y += a.y;
        return *this;
    }

    double x;
    double y;
};

class Shape
{
public:
    virtual void move_by(const Point &vector) = 0;
    virtual void resize_by(const double &factor) = 0;
    virtual ~Shape();
};

class Circle
    : public Shape
{
public:
    Circle(const Point &c, const double &r)
        : m_center(c)
        , m_radius(r)
    {
        assert(r > 0.0);
    }

public:
    void move_by(const Point &vector)
    {
        m_center += vector;
    }

    void resize_by(const double &factor)
    {
        assert(factor > 0.0);
        m_radius *= factor;
    }

private:
    Point m_center;
    double m_radius;
};

class Rectangle
    : public Shape
{
public:
    Rectangle(const Point &lb, const double &width, const double &height)
        : m_left_bottom(lb)
        , m_width(width)
        , m_height(height)
    {
        assert(width > 0.0);
        assert(height > 0.0);
    }

public:
    void move_by(const Point &vector)
    {
        m_left_bottom += vector;
    }

    void resize_by(const double &factor)
    {
        assert(factor > 0.0);
        m_width *= factor;
        m_height *= factor;
    }

private:
    Point m_left_bottom;
    double m_width;
    double m_height;
};

class ShapeMaker
{
public:
    virtual Shape* make(const std::string &s) = 0;
    virtual ~ShapeMaker() { }
};

class SimpleShapeMaker
    : public ShapeMaker
{
public:
    Shape* make(const std::string &s)
    {
        if (s == "Circle") {
            return new Circle(Point(), 1.0);
        }
        else if (s == "Rectangle") {
            return new Rectangle(Point(), 1.0, 1.0);
        }
        return 0;
    }
};