#include <iostream>
using namespace std;
// abstract product class
class DisplayDriver {
public:
virtual void DisplayOperation() = 0;
};
// concrete product class
class HighResDispDriver : public DisplayDriver {
public:
virtual void DisplayOperation() {
cout << "High Resolution Display" << endl;
}
};
// concrete product class
class LowResDispDriver : public DisplayDriver {
public:
virtual void DisplayOperation() {
cout << "Low Resolution Display" << endl;
}
};
// abstract product class
class PrinterDriver {
public:
virtual void PrinterOperation() = 0;
};
// concrete product class
class HighResPrintDriver : public PrinterDriver {
public:
virtual void PrinterOperation() {
cout << "High Resolution Printer" << endl;
}
};
// concrete product class
class LowResPrintDriver : public PrinterDriver {
public:
virtual void PrinterOperation() {
cout << "Low Resolution Printer" << endl;
}
};
// abstract factory class
class AbstractFactory {
public:
virtual DisplayDriver* CreateDisplayDriver() = 0;
virtual PrinterDriver* CreatePrinterDriver() = 0;
};
// concrete factory class
class HighResFactory : public AbstractFactory {
public:
virtual DisplayDriver* CreateDisplayDriver() {
return new HighResDispDriver;
}
virtual PrinterDriver* CreatePrinterDriver() {
return new HighResPrintDriver;
}
};
// concrete factory class
class LowResFactory : public AbstractFactory {
public:
virtual DisplayDriver* CreateDisplayDriver() {
return new LowResDispDriver;
}
virtual PrinterDriver* CreatePrinterDriver() {
return new LowResPrintDriver;
}
};
// client
int main(int argc, char **argv) {
AbstractFactory *factory;
DisplayDriver *display;
PrinterDriver *printer;
for (int i=0; i<2; ++i) {
if (i == 0) {
factory = new HighResFactory;
} else {
factory = new LowResFactory;
}
display = factory->CreateDisplayDriver();
printer = factory->CreatePrinterDriver();
display->DisplayOperation();
printer->PrinterOperation();
delete factory;
delete display; // ここで delete するのはどうか。。
delete printer; // ここで delete するのはどうか。。
}
return 0;
}