工厂模式智能化实现.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
工厂模式智能化实现

由名字创建对象其实的有挺强的背景,那就是软件工程学中的对象持久性问题。本文讨论的方法也是持久性的一个可能实现。废话少说,看看C++是怎么做的。 动态创建当然要用指针。我们不希望在程序中出现硬编码: Shape * pShape = new Circle; 那就用函数/对象包装一下。函数包装简单、高效一些。于是有Circle类的成员函数: Shape *createInstance() {return new Circle;} 我们需要用这个函数去创建Circle对象,同时只有Circle对象创建以后才可以调用createInstance()。这是一对矛盾。解决的办法是将createInstance()写成静态函数。于是Shpae和Circle类长的是这个样子: class Shape{ public: virtual void Draw() = 0; }; class Circle : public Shape{ public: void Draw() { std::cout Drawing a Circle......Done std::endl; } static Shape *createInstance() {return new Circle;} }; 指向createInstance()的函数指针当然要放在工厂类里面,同时要和创建对象的名字关联起来。std::map的键-值组合当然是最佳人选。我们还有如下定义: typedef Shape *(*FactoryFunction)(); FactoryFunction就是一个指向函数的指针,而这个函数返回一个Shape *类型。如果你对FactoryFunction有疑问,可以看看关于函数指针的书。 有了FactoryFunction,我们来定义工厂类中的map: std::mapstd::string,FactoryFunction m_FactoryFunctions; 这样的map对象是把名字(string类型)和函数指针作为一个组合。向工厂登记产品的时候,函数可以写成这样: void ShapeFactory::Register(std::string name, FactoryFunction instanceFunction){ m_FactoryFunctions[name] = instanceFunction; } 登记Circle类的创建函数: Register(circle, Circle::createInstance); ShapeFactory类中由名字得到函数指针可以写成这样: Shape * ShapeFactory::getInstance(std::string name) { if (m_FactoryFunctions.count(name)) return m_FactoryFunctions[name](); else return NULL; } map.count()的用法可以看看STL的手册。ShapeFacoty的完整定义如下: class ShapeFactory { public: static void Register(std::string name, FactoryFunction instanceFunction) {m_FactoryFunctions[name] = instanceFunction;}; static Shape * getInstance (std::string name) { if (m_FactoryFunctions.count(name)) return m_FactoryFunctions[name](); else return NULL; } private: static std::mapstd::string,FactoryFunction m_FactoryFunctions; }; std::mapstd::string,FactoryFunction ShapeFactory::m_FactoryFunctions; 其中Register()和getInstance()是静态函数,m_FactoryFunctions是静态成员变量。之所以这样做是避免创建ShapeFactory对象,以简化编程。同时便于用单例(Singleton)模式实现ShapeFactory。 这些完成以后,就可以向工厂登记产品和使用产品了。

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档