C++类工厂的原理和实现

类工厂在设计模式中,有很大的影响,在实际应用中,依然有很高的价值。但是,在C++中,实际上,没有类的描述信息。比如说,你不能通过指定字符串HelloWorld,来自动生成一个HelloWorld类的实例。但在技术,依然提供类似这种可能。

我们假设这样的一个场景,我在类工厂里面指定一系列类的定义,并为这些类指定对应的名字,比如“HelloWorld”对应于HelloWorld类,而"HelloWorld1"对应于HelloWorld1类。那么,当我需要HelloWorld的时候,我只要指定"HelloWorld"字符串,就会生成对应类的实例。

一个简单的实现可以是这样的:

void * create(std::string& class_name) { if(class_name == "HelloWorld") return new HelloWorld() ; if(class_name == "HelloWorld1") return new HelloWorld1() ; return NULL ; }

 

这个实现实在太简单了,不过至少成功满足这个需求,同时也指示出一个原理。我们后面继续基于这个例子继续深化。

 

然后,我们提出一个需求,希望我定义HelloWorld类,他就能自动帮我添加到类工厂里,否则,用起来实在麻烦了。

这个需求又提出第二个问题,自动向类工厂注册的问题。幸好,C++提供一个很好的特性,就是自动初始化功能。当你定义类,然后声明类的实例后,这个实例会自动在被初始化,这个初始化只会出现类,而不会是结构或者基础类型,比如int。好了,我们就利用这个特性。

 

class base { public: std::string name ; } ; base * (*base_create_fun)() ; class factory { private: std::map<std::string , base_create_fun> base_funs_ ; public : void add_fun(std::string& name , base_create_fun fun) ; base *spawn(std::string& name) ; } ; factory base_factory ; #define DEFINE_FACTORY_CLASS(NAME) / base * NAME##_base_create_fun() / { / return new NAME() ; / } / class NAME##_base_create_fun_register/ { / public: / NAME##_base_create_fun_register()/ { / base_factory.add_fun( / #NAME , NAME##_base_create_fun / ) ; / } / } ; / / NAME##_base_create_fun_register / NAME##_base_create_fun_register_instance ;

 

很抱歉的是,这段代码没有经过测试,但原理都包含这里面。类似的代码已经应用生产环境中,因此可行性不需要质疑。

你可能感兴趣的:(设计模式,C++,String,null,Class,fun)