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)
使用原始指针很容易出错.使用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)