#include <iostream>
#define _safe_delete_(ptr) \
if(ptr != nullptr) { delete ptr; ptr = nullptr; }
typedef enum PRODUCTTYPE
{
PRODUCTTYPEA,
PRODUCTTYPEB,
}PType;
class Product
{
public:
virtual ~Product() { }
virtual void operation() = 0;
};
class ProductA : public Product
{
public:
ProductA() { }
virtual ~ProductA() { }
virtual void operation() override final
{
std::cout << "Product A operation.\n";
}
private:
};
class ProductB : public Product
{
public:
ProductB() { }
virtual ~ProductB() { }
virtual void operation() override final
{
std::cout << "Product B operation.\n";
}
private:
};
class Factory
{
public:
Product* create(const PType _ptype )
{
switch(_ptype)
{
case PRODUCTTYPEA:
product = new ProductA();
break;
case PRODUCTTYPEB:
product = new ProductB();
break;
default:
break;
}
return product;
}
private:
Product *product;
};
void test01()
{
Factory* factory = new Factory();
Product* productA = factory->create(PRODUCTTYPEA);
Product* productB = factory->create(PRODUCTTYPEB);
productA->operation();
productB->operation();
_safe_delete_(factory);
_safe_delete_(productA);
_safe_delete_(productB);
}
int main(void)
{
test01();
return 0;
}