您的位置:首页 > 编程语言

设计模式之五:工厂方法模式(Factory Method)

2017-07-05 09:01 447 查看
工厂方法模式:定义了一个创建对象的接口,由子类来决定详细实例化那个对象。工厂方法模式让类的实例化转移到子类中来推断。

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:
virtual void 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()
{
return new ConcreteProductA();
}

};

class ConcreteCreatorB:public Creator
{
public:
Product* factoryMethod()
{
return new 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;
return 0;
}


測试输出:



事实上还能够一个详细的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:
virtual void 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:
virtual void 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();
return 0;

}


測试输出:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐