// factory design
// 工厂化模式的智能化实现:通过名字来实现
//#pragma warning (disable:4786)
#include
#include
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 m_FactoryFunctions;
};
std::map 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;
}
阅读(829) | 评论(0) | 转发(0) |