应该删除工厂方法创建的对象在哪里?

Aqu*_*irl 1 c++ design-patterns factory factory-pattern

创建对象的方式和位置应该returnShapeType删除?
这是一个工厂方法演示程序.

请出示代码.

class Shape
{
public:
    Shape() {}
    virtual void print() {std::cout << "\nFrom shape print";}
};

class Triangle: public Shape
{
public:
    Triangle(){}
    virtual void print() {std::cout << "\nFrom triangle print";}
};

class Rectangle: public Shape
{
public:
    Rectangle(){}
    virtual void print() {std::cout << "\nFrom rect print";}
};

class CreateShapeObject
{
public:
    CreateShapeObject() {}

    Shape *returnShapeType( std::string arg )
    {
        if (arg == "Triangle")
            return new Triangle;
        else if (arg == "Rectangle")
            return new Rectangle;
    }
};

////////////

class EndDeveloper
{
public:
    CreateShapeObject obj;

    EndDeveloper()
    {
        Shape *p = obj.returnShapeType("Triangle");
        p->print();

        Shape *q = obj.returnShapeType("Rectangle");
        q->print();


    }
};
Run Code Online (Sandbox Code Playgroud)

kri*_*isz 7

使用原始指针很容易出错.使用unique_ptr:

std::unique_ptr<Shape> returnShapeType(const std::string& arg)
{
    if (arg == "Triangle")
        return std::make_unique<Triangle>();
    else if (arg == "Rectangle")
        return std::make_unique<Rectangle>();
    throw std::invalid_argument("Invalid shape");
}
Run Code Online (Sandbox Code Playgroud)

您可以方便地使用它auto:

auto shape = obj.returnShapeType("Triangle");
Run Code Online (Sandbox Code Playgroud)

unique_ptr也可以隐式转换为shared_ptr:

std::shared_ptr<Shape> shape = obj.returnShapeType("Triangle");
Run Code Online (Sandbox Code Playgroud)

  • 唯一指针也是词汇类型.它具有明显的优势,即在函数的签名中说:"此指针没有其他句柄".这是关于所有权的强烈而明确的信息,IMO.它应该是默认选择. (2认同)