设计模式之五:工厂方法模式(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++代码例如以下:
測试输出:
事实上还能够一个详细的ConcreteCreator相应多个ConcreteProduct,这里以一个样例为例分析:
Product为Page
ConcreteProduct包含SkillPage,EducationPage,ExperiencePage
Creator为Document(文档)
ConcreteCreator为Report(报告文档,报告文档中有SkillPage,EducationPage),Resume(简历文档。简历文档中有SkillPage,EducationPage,ExperiencePage)
这也是一个工厂方法模式的样例
UML图为:
C++代码实现例如以下:
測试输出:
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; }
測试输出:
相关文章推荐
- .NET设计模式-工厂方法模式(Factory Method)
- .NET设计模式(5):工厂方法模式(Factory Method)
- 步步为营 .NET 设计模式学习笔记 二十四、Factory Method(工厂方法模式)
- 设计模式笔记之工厂模式--工厂方法模式(Factory Method)
- 温习C#设计模式之(二) 工厂方法模式(Factory Method)
- 设计模式之—工厂方法模式(FactoryMethod)-Java实现
- [导入]C#面向对象设计模式纵横谈(5):Factory Method 工厂方法模式(创建型模式).zip(10.09 MB)
- 设计模式之一---工厂方法模式【Factory Method模式】
- 步步为营 .NET 设计模式学习笔记 二十四、Factory Method(工厂方法模式)
- 四.创建型设计模式——Factory Method Pattern(工厂方法模式)
- 设计模式(Design Patterns)--工厂方法模式(Factory Method)
- 设计模式之工厂方法模式(FactoryMethod)
- .NET设计模式:工厂方法模式(Factory Method)BY Terrylee
- .Net设计模式学习笔记(五):工厂方法模式(Factory Method)
- 步步为营 .NET 设计模式学习笔记 二十四、Factory Method(工厂方法模式)
- 设计模式——工厂方法模式(FactoryMethod)和抽象工厂模式(Abstract Factory)
- 设计模式读书笔记之工厂方法模式(Factory method)
- 设计模式2:Factory Method Pattern(工厂方法模式)
- 艾伟_转载:.NET设计模式:工厂方法模式(Factory Method)
- C#设计模式之工厂模式(Factory)--02 工厂方法模式(Factory Method)