您的位置:首页 > 编程语言 > C语言/C++

C++ 工厂方法2

2011-12-29 15:37 134 查看
#include <iostream>
#include <map>
#include <string>
class DeviceBase;
typedef DeviceBase* (*FactoryFunction)();
class DeviceFactory
{
public:
static void Register(std::string name, FactoryFunction instanceFunction)
{
m_FactoryFunctions[name] = instanceFunction;
}
static DeviceBase* GetInstance(std::string name)
{
if (m_FactoryFunctions.count(name))
{
return m_FactoryFunctions[name]();
}
else
{
return NULL;
}
}
private:
static std::map<std::string, FactoryFunction> m_FactoryFunctions;
};
std::map<std::string, FactoryFunction> DeviceFactory::m_FactoryFunctions;

class DeviceBase
{
public:
virtual void Draw() = 0;
};
class Circle : public DeviceBase
{
public:
void Draw()
{
std::cout << "Drawing a Circle......Done" << std::endl;
}
static DeviceBase* CreateInstance()
{
return new Circle;
}
};
class Triangle : public DeviceBase
{
public:
void Draw()
{
std::cout << "Drawing a Triangle......Done" << std::endl;
}
static DeviceBase* CreateInstance()
{
return new Triangle;
}
};
// 工厂模式中的单例模式
class TSingleton : public DeviceBase
{
public:
void Draw()
{
std::cout << "Test Singleton......Done" << std::endl;
}
static DeviceBase* CreateInstance()
{
static TSingleton* _instance = new TSingleton;
return _instance;
}
};
int main()
{
DeviceFactory::Register("circle", &Circle::CreateInstance);
DeviceFactory::Register("triangle", &Triangle::CreateInstance);
DeviceFactory::Register("singleton", &TSingleton::CreateInstance);
DeviceBase* pShape = NULL;
pShape = DeviceFactory::GetInstance("singleton");
if (NULL == pShape)
{
std::cout << "Can't find the produce in the factory!" << std::endl;
}
else
{
pShape->Draw();
delete pShape;
pShape = NULL;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: