下面抽象工厂设计模式的实现是正确的吗
Is below implementation of Abstract Factory Design Pattern is correct?
以下抽象工厂设计模式的实现是否正确?
#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
和派生类(不应该有create方法。工厂进行创建,返回的对象应该可以使用了。
这可能只是方法名称选择不当,但应该进行更正以防止混淆。为了您的示例,您可以简单地将函数重命名为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;
}
};
旁注
抽象乘积和AbstractFactory
需要虚拟析构函数。为什么在这里讨论:何时使用虚拟析构函数?。
在派生类中,您不需要重新声明方法是virtual
。一旦一个方法在基类中声明为virtual
,所有重写都将自动为virtual
。此外,要习惯于对应该重写的方法使用override
关键字。如果接口发生更改并留下不再重写的方法,那么在防止错误方面非常有用。
不要忘记delete
工厂提供的所有对象。如果您可以使用std::unique_ptr
,请选择它。
CCD_ 11和CCD_。例如:如果提供的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");
}
相关文章:
- 如何在从抽象基派生的类中实现相同的方法?
- 硬件抽象层 (HAL) 中实现的动态切换
- 下面抽象工厂设计模式的实现是正确的吗
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 使用抽象类的类和实现此抽象类的创建对象
- GMock - 用另一个实现模拟抽象类
- 如何在抽象基类中实现运算符+
- 类中的多态函数,实现抽象类
- 从继承的类中实现抽象方法
- 在C++中实现抽象工厂 PIMPL 习语的运行时错误
- 如何正确实现抽象类
- 为不同的形状实现抽象的"重叠"方法?
- C++:使用模板化类来实现抽象类
- 如何在可变上下文中使用抽象类时实现抽象方法
- 在c++中实现抽象接口的操作符重载
- 在父类中实现抽象类成员
- 如何在c++中实现抽象类,同时允许子类方法调用
- 这个程序是如何实现抽象概念的
- 关于在c++中实现抽象函数的问题