Chinaunix首页 | 论坛 | 博客
  • 博客访问: 64458
  • 博文数量: 15
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-22 09:09
文章分类

全部博文(15)

文章存档

2009年(15)

我的朋友
最近访客

分类: C/C++

2009-04-17 16:45:39

// factory design
// 工厂化模式的智能化实现:通过名字来实现
//#pragma warning (disable:4786)
#include
#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) |
给主人留下些什么吧!~~