抽象工厂模式客户端代码

Abstract Factory Pattern Client Code

本文关键字:代码 客户端 模式 工厂 抽象      更新时间:2023-10-16

我正试图为abs工厂编写客户端代码,但我被客户端代码卡住了。我无法通过Factorymaker.getFactory("Bshell");实例化任何Bshell。代码是在没有客户端代码的情况下编译的

(我是stackoverflow的新手。我的iostream在我的代码中是正常的。)

#include <iostream> 
using namespace std;
//This is the abstract product.
class Shell {
public:
    virtual void printShell(){ cout << "I am the abstract productn"; }
};
class Bshell : public Shell {
public:
    Bshell();
    Bshell(string arg){ cout << "I am " << arg << endl; }
    void printShell(){ cout << "I am Bshelln"; }
};
class Cshell : public Shell {
public:
    Cshell();
    Cshell(string arg){ cout << "I am " << arg << endl; }
    void printShell(){ cout << "I am Cshelln"; }
};
class Kshell : public Shell {
public:
    Kshell();
    Kshell(string arg){ cout << "I am " << arg << endl; }
    void printShell(){ cout << "I am Kshelln"; }
};
//This is the abstract factory.
class ShellFactory {
public:
    virtual Shell* createBshell();
    virtual Shell* createCshell();
    virtual Shell* createKshell();
};
//Concrete factories
class BShellFactory : public ShellFactory {
public:
    Shell* createBshell(){ return new Bshell("Bshell"); }
};
class CShellFactory : public ShellFactory {
public:
    Shell* createCshell(){ return new Cshell("Cshell"); }
};
class KShellFactory : public ShellFactory {
public:
    Shell* createKshell(){ return new Kshell("Kshell"); }
};
//indirectly instantiating factories
class Factorymaker {
private:
    ShellFactory *sf = NULL;
public:
    ShellFactory* getFactory(string choice){
        if (choice == "Bshell"){ sf = new BShellFactory(); }
        else if (choice == "Cshell"){ sf = new CShellFactory(); }
        else if (choice == "Kshell"){ sf = new KShellFactory(); }
        return this->sf;
    }
};
int main()
{
    Factorymaker *fmaker = new Factorymaker();
    ShellFactory *sf = fmaker.getFactory("Bshell");
    Bshell bshellproduct = sf.createBshell();
    return 0;
}

fmakersf是指针,因此使用->而不是.来访问它们的成员。

sf->createBshell()的返回类型是Shell*,因此应该是bshellproduct的类型。

你的编译器应该告诉你所有这些。