- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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。
这些完成以后,就可以向工厂登记产品和使用产品了。
您可能关注的文档
最近下载
- 幼儿园木工课程.pptx VIP
- 风力发电项目PC施工总包合同.pdf VIP
- 2017年山东省青岛市城阳七年级英语下册 Unit 1-2 复习练习题(无答案)(新版)人教新目标版.doc VIP
- 禽类屠宰与分割车间设计规范sbj15-2022.docx VIP
- 浙大二院急诊科进修汇报.pptx VIP
- 全国计算机等级考试二级 MS Office高级应用ppt全套教学课件完整版电子教案.docx VIP
- 中国重症心血管疾病患者临床营养评估和管理专家共识解读PPT课件.pptx VIP
- 中国重症心血管疾病患者临床营养评估和管理专家共识解读PPT课件.pptx VIP
- 瑞普德R8060M,R8080M用户手册调试参数设置资料.pdf
- 输变电工程标准工艺(变电工程土建分册)2022版.pdf VIP
文档评论(0)