通用工厂类(generic factory class)

通用工厂类(generic factory class)

  旧项目结束,新项目开始,今天开始阅读新项目相关的代码。公司的代码中大量的运用了工厂技术,不过很可惜是simple factory,这样当你新加入一种对象类型的时候都需要去工厂的实现代码(实际上在旧代码实现中还不止如此,乃至于公用父类也需要修改)。这是一件不太好的事情,于是我希望在自己的代码中重新实现,以减少维护量。
  我记得《C++对话系列》中有一些相关的讨论,于是我找来查看。非常幸运的,我发现这正是我需要的东西,于是几乎照抄的把代码实现了,代码测试通过。为了符合我自己的阅读习惯,我把其中的一个函数及变量的命名改动了一下:
  factory.hpp
#pragma once
#pragma warning (disable:
4786 )
/* *******************************************************************
created:    2008-10-22
author:        lixianmin

purpose:    a generic factory method lib
reference:  《C++对话系列--Abstract Factory, Template Style》
Copyright (C) 2008 - All Rights Reserved
********************************************************************
*/
#include 
< string >
#include 
< map >
namespace  lib
{
    
// 通用工厂类,根据传入的id创建产品对象
    template  < typename BaseType, typename KeyType = std:: string >
    
class  factory
    {
    
private :
        typedef std::auto_ptr
< BaseType >  ( * BaseCreateFunc)();
        typedef std::map
< KeyType, BaseCreateFunc >  FuncRegistry;
    
public :
        
static  factory < BaseType, KeyType >&  get_instance()         // static singleton,不适用于多线程
        {
            
static  factory < BaseType, KeyType >  obj;
            
return  obj;
        }
        std::auto_ptr
< BaseType >  create( const  KeyType &  id)  const
        {
            std::auto_ptr
< BaseType >  obj;
            FuncRegistry::const_iterator regEntry 
=  _registry.find(id);
            
if  (regEntry  !=  _registry.end()) 
            {
                obj 
=  regEntry -> second();
            }
            
return  obj;
        }
        
void  _register_create_function( const  KeyType &  id, BaseCreateFunc func){_registry[id]  =  func;}
    
private :
        factory(
void ){}
        factory(
const  factory &  other);
        factory 
operator = ( const  factory &  other);
    
private :
        FuncRegistry _registry;
    };
    
// 类型(DerivedType)注册类,只要在DerivedType类定义(DerivedType.cpp文件)的最后声明一个 lib::factory_register<Base, Derived> reg(id);对象即可
    template  < typename BaseType, typename DerivedType, typename KeyType = std:: string >
    
class  factory_register
    {
    
public :
        factory_register(
const  KeyType &  id)
        {
            factory
< BaseType, KeyType > ::get_instance()._register_create_function(id, _create_instance);
        }
    
private :
        
static  std::auto_ptr < BaseType >  _create_instance(){ return  std::auto_ptr < BaseType > ( new  DerivedType);}
    
private :
        friend 
class  factory < BaseType, KeyType > ;
    };
}

测试代码:
#include  < iostream >
#include 
" factory.hpp "
// 基类
class  Base
{
public :
    
virtual   void  print( void )
    {
        std::cout
<< " base class " << std::endl;
    }
};
lib::factory_register
< Base, Base >  reg1( " base " );             // 注册Base类型,定义一个file scope的变量,通常应该置于Base.cpp文件结尾
// 派生类
class  Derived: public  Base
{
public :
    
virtual   void  print( void )
    {
        std::cout
<< " derived class " << std::endl;
    }
};
lib::factory_register
< Base, Derived >  reg2( " derived " );     // 注册Derived类型,定义一个file scope的变量,通常应该置于Derived.cpp文件结尾

// 声明一个全局函数(简化操作,非必需)
lib::factory < Base >&  glb_GetFactory( void )
{
    
return  lib::factory < Base > ::get_instance();
}
int  main( int  argc,  char *  argv[])
{
    std::auto_ptr
< Base >   base = glb_GetFactory().create( " base " );
    
if  ( base . get ())
    {
        
base -> print();
    }
    std::auto_ptr
< Base >  derived = glb_GetFactory().create( " derived " );
    
if  (derived. get ())
    {
        derived
-> print();
    }

    system(
" pause " );
    
return   0 ;
}
输出:
base class
derived class
请按任意键继续. . .




你可能感兴趣的:(通用工厂类(generic factory class))