C++ 工廠方法2

#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;
}


發佈了11 篇原創文章 · 獲贊 6 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章