gpt4 book ai didi

c++ - 以下抽象工厂设计模式的实现是否正确?

转载 作者:行者123 更新时间:2023-11-28 04:35:17 36 4
gpt4 key购买 nike

以下抽象工厂设计模式的实现是否正确?

    #include<iostream>

using namespace std;

//Abstract Product A

class Document
{

public:

virtual void createDocument() = 0;

};


class Word: public Document

{

public :


virtual void createDocument()
{

cout<<"Document Word is created"<<endl;

}
};


class Excel : public Document
{
public :

virtual void createDocument()
{
cout<<"Document Excel is created"<<endl;
}
};

//Abstract Product B


class VideoFile
{

public:

virtual void createVideoFile() = 0;

};


class VLC : public VideoFile
{

public :

virtual void createVideoFile()
{
cout<<"VideoFile VLC is created"<<endl;

}
};


class AVI : public VideoFile
{

public :

virtual void createVideoFile()
{

cout<<"VideoFile AVI is created"<<endl;

}
};



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


class AbstractFactory

{

public:

virtual Document* createDocFiles(string fileType) = 0;

virtual VideoFile* createVideoFiles(string fileType) = 0;

};


class ConcreteFactoryA : public AbstractFactory
{

public:

virtual Document* createDocFiles(string fileType)
{

if(fileType == "Word")
return new Word();
if(fileType == "Excel")
return new Excel();
}

virtual VideoFile* createVideoFiles(string fileType)
{

if(fileType == "VLC")
return new VLC();
if(fileType == "AVI")
return new AVI();
}

};


class ConcreteFactoryB : public AbstractFactory
{

public:

virtual Document* createDocFiles(string fileType)
{

if(fileType == "Word")
return new Word();
if(fileType == "Excel")
return new Excel();
}

virtual VideoFile* createVideoFiles(string fileType)
{

if(fileType == "VLC")
return new VLC();
if(fileType == "AVI")
return new AVI();
}

};



int main()
{

AbstractFactory *ptrAbFac = new ConcreteFactoryB();

Document *ptrDoc = ptrAbFac->createDocFiles("Excel");

ptrDoc->createDocument();

VideoFile *ptrVideoFile = ptrAbFac->createVideoFiles("VLC");

ptrVideoFile->createVideoFile();

}

最佳答案

你很接近,但是抽象产品类(Document 和派生类以及 VideoFile 和派生类)不应该有创建方法。工厂进行创建,返回的对象应该可以使用了。

这可能只是方法名称选择不当,但应该更正以防止混淆。为了您的示例,您可以简单地将函数重命名为 DoSomething,这样您就可以调用一个方法来证明成功。示例:

class Document
{
public:
virtual ~Document() = default; // must have virtual destructor
virtual void doSomething() = 0;
};

class Word: public Document
{
public :
void doSomething() override // no need for virtual.
// override helps prevent mistakes
{
cout<<"Document Word"<<endl;
}
};

旁注

Abstract Products 和AbstractFactory 需要虚拟析构函数。在这里讨论原因:When to use virtual destructors? .

在派生类中,您不需要重新声明这些方法是虚拟的。一旦基类中的方法被声明为 virtual,所有重写都会自动为 virtual。此外,习惯于对应该覆盖的方法使用 override 关键字。如果接口(interface)发生变化并让您使用不再覆盖的方法,这对于防止错误非常有用。

不要忘记删除工厂提供的所有对象。 Prefer std::unique_ptr if it is available to you.

createDocFilescreateVideoFiles(这两个实现)不会在所有可能的路径中返回。例如:如果提供的 fileType 是“Word Perfect”,则 createDocFiles 不会返回任何内容。编译器通常会对此进行标记,但允许程序编译(除非您已将警告设置为错误)。如果程序编译时出现警告,则很可能该程序没有执行您希望它执行的操作。修复:

        virtual Document* createDocFiles(string fileType)
{
if(fileType == "Word")
return new Word();
if(fileType == "Excel")
return new Excel();
throw std::runtime_error("Unknown file type");
}

关于c++ - 以下抽象工厂设计模式的实现是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51619939/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com