c++ - 关于纯抽象类中的静态成员函数 - 设计模式?

标签 c++ stl polymorphism static-methods

我最近发现了一个在纯抽象类中使用静态成员函数来初始化指向其派生类对象的指针的例子。 我想知道,这是一种设计模式还是一种良好的编程习惯?下面的代码只是一个例子(例如 defineRectangle() 和 defineCircle() 成员 函数):

class Shape;

typedef std::unique_ptr<Shape> shape_ptr;

class Shape{

    public:

        Shape(){};
        virtual ~Shape(){};

        virtual void draw() const = 0;
        virtual float area() const = 0;

        virtual shape_ptr clone() const = 0;
        virtual shape_ptr create() const = 0;

        static shape_ptr defineRectangle(int, int );
        static shape_ptr defineCircle(float);
};

shape_ptr Shape::defineRectangle(int height, int width){
    shape_ptr ptrRectangle = shape_ptr(new Rectangle(height, width));
    return (ptrRectangle);
}

shape_ptr Shape::defineCircle(float radius){
    shape_ptr ptrCircle = shape_ptr(new Circle(radius));
    return (ptrCircle);
}

最终目标是定义一个派生类的容器。例如:

std::vector<std::unique_ptr<Shape> > vect;

然后我们可以通过调用 Shape 类的静态成员函数在容器中添加派生类:

vect.push_back(Shape::defineCircle(10));
vect.push_back(Shape::defineRectangle(5, 4));

或者直接不带任何接口(interface):

vect.push_back(std::unique_ptr<Shape>(new Circle(10)));
vect.push_back(std::unique_ptr<Shape>(new Rectangle(5,4)));

在容器中添加派生类的两种方法中,应该首选哪一种?为什么?
完整代码可以在下面找到link .
它上面的任何灯都非常受欢迎;-)

最佳答案

I was wondering, if it's a design pattern or if it's a good programming practice?

是的,它是 factory pattern 的变体.

基本上,它允许您拥有一个方法,该方法将根据该方法的参数分派(dispatch)正确派生对象类型的动态创建。这允许您在代码中使用相同的“工厂”函数,并且如果工厂方法创建的底层对象有任何更改或添加,您不必更改实际调用“工厂”函数的代码.因此,它是一种封装形式,将对象创建的任何更改隔离到“工厂”后面的代码段,而不是调用“工厂”的代码。例如,使用工厂时,添加工厂方法可以创建的新类型相对简单,但之前调用工厂的代码无需更改。您只需为要创建的新对象创建一个新的派生类,并为需要该新对象的任何新代码传递正确的新参数。所有旧参数仍然有效,并且在返回的指针类型等方面不需要在代码中进行更改。

在工厂中使用智能指针的原因是为了避免指针所有权不明确时可能发生的内存泄漏。例如,工厂必须返回一个指针,因为它正在动态地创建对象。那么问题就变成了谁清理指针以避免悬空指针或内存泄漏?智能指针解决了这个所有权问题,并保证当其他对象仍然指向该内存时内存不会被无意中清理,或者内存不会简单地丢失,因为指向该内存位置的最后一个指针在没有得到的情况下超出了范围delete 对其调用。

关于c++ - 关于纯抽象类中的静态成员函数 - 设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8964004/

相关文章:

haskell - 为什么非多态类型不能在 Haskell 中实现可折叠?

c++ - Mac OSX 10.7 Lion Audio Unit Effect 模板编译失败

C++ 时间(而不是日期)期间

c++ - 适用于容器每个成员的 STL 函数是否可以接受外部参数?

c++ - 愚蠢的STL问题

c++ - TBB Concurrent Vector 和 STL Vector 的区别?

c++ - vector::push_back 在没有复制构造函数的对象上——指针值丢失了吗?

c# - 派生类对象如何添加到基类对象列表

c++ - 我的 C/C++ 程序在运行后立即关闭。必须使用 ConsolePauser.exe 运行

iterator - 如何迭代结构集合作为特征对象引用的迭代器?