设计模式之五:工厂方法模式(Factory Method)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了设计模式之五:工厂方法模式(Factory Method),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3754字,纯文字阅读大概需要6分钟。
内容图文
工厂方法模式:定义了一个创建对象的接口,由子类来决定详细实例化那个对象。工厂方法模式让类的实例化转移到子类中来推断。
Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.
UML图:
主要包含:
- Product(Page):定义了工厂类创建的对象的接口
- ConcreteProduct(SkillPage,EducationPage,ExperiencePage):实现了Product的详细的类
- Creator(Document):声明了一个工厂方法,这种方法返回一个Product类型的对象。
- ConcreteCreator(Report,Resume):重写工厂方法来实例化详细的Product
上面的UML是工厂方法模式一般的图例,针对一个详细的有两个ConcreteProductA,ConcreteProductB。以及它们各自工厂类ConcreteCreatorA。ConcreteCreatorB的UML图例如以下所看到的:
C++代码例如以下:
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
class Product
{
public:
virtualvoid show()=0;
};
class ConcreteProductA:public Product
{
public:
void show()
{
std::cout<<"ConcreteProductA:show"<<std::endl;
}
};
class ConcreteProductB:public Product
{
public:
void show()
{
std::cout<<"ConcreteProductB:show"<<std::endl;
}
};
class Creator
{
public:
virtual Product * factoryMethod()=0;
};
class ConcreteCreatorA:public Creator
{
public:
Product* factoryMethod()
{
returnnew ConcreteProductA();
}
};
class ConcreteCreatorB:public Creator
{
public:
Product* factoryMethod()
{
returnnew ConcreteProductB();
}
};
int main()
{
std::cout<<"工厂方法模式"<<std::endl;
Creator * creatorA=new ConcreteCreatorA;
Creator * creatorB=new ConcreteCreatorB;
Product * pa=creatorA->factoryMethod();
Product* pb=creatorB->factoryMethod();
pa->show();
pb->show();
delete creatorA;
delete creatorB;
delete pa;
delete pb;
return0;
}
測试输出:
事实上还能够一个详细的ConcreteCreator相应多个ConcreteProduct,这里以一个样例为例分析:
- Product为Page
- ConcreteProduct包含SkillPage,EducationPage,ExperiencePage
- Creator为Document(文档)
- ConcreteCreator为Report(报告文档,报告文档中有SkillPage,EducationPage),Resume(简历文档。简历文档中有SkillPage,EducationPage,ExperiencePage)
这也是一个工厂方法模式的样例
UML图为:
C++代码实现例如以下:
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <list>
#include <algorithm>
using
namespace
std;
class Page
{
public:
virtualvoid show()=0;
};
class SkillPage:public Page
{
public:
void show()
{
std::cout<<"SkillPage::show"<<std::endl;
}
};
class EducationPage:public Page
{
public:
void show()
{
std::cout<<"Education::show"<<std::endl;
}
};
class ExperiencePage:public Page
{
public:
void show()
{
std::cout<<"Experience::show"<<std::endl;
}
};
class Document
{
public:
virtualvoid factoryMethod()=0;
list<Page*>& getLists()
{
return lists;
}
void print()
{
list<Page*>::iterator iter;
for(iter=lists.begin();iter!=lists.end();iter++)
(*iter)->show();
}
//注意这里要将list中的指针指向的内存删除掉,不然会造成内存泄露virtual ~Document(){
list<Page*>::iterator iter;
for(iter=lists.begin();iter!=lists.end();iter++)
{
if(*iter)
delete *iter;
}
}
private:
list<Page*> lists;
};
class Report:public Document
{
public:
void factoryMethod()
{
getLists().push_back(new SkillPage());
getLists().push_back(new EducationPage());
}
};
class Resume:public Document
{
public:
void factoryMethod()
{
getLists().push_back(new SkillPage());
getLists().push_back(new EducationPage());
getLists().push_back(new ExperiencePage());
}
};
int main()
{
std::cout<<"详细的工厂方法模式測试"<<std::endl;
Document * report=new Report();
Document * resume=new Resume();
report->factoryMethod();
resume->factoryMethod();
std::cout<<"report print"<<std::endl;
report->print();
std::cout<<"resume print"<<std::endl;
resume->print();
return0;
}
測试输出:
原文:http://www.cnblogs.com/jhcelue/p/7119458.html
内容总结
以上是互联网集市为您收集整理的设计模式之五:工厂方法模式(Factory Method)全部内容,希望文章能够帮你解决设计模式之五:工厂方法模式(Factory Method)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。