设计模式之五:工厂方法模式(Factory Method)
工厂方法模式:定义了一个创建对象的接口,由子类来决定详细实例化那个对象。工厂方法模式让类的实例化转移到子类中来推断。
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;
}
測试输出:
设计模式之五:工厂方法模式(Factory Method)的更多相关文章
- 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...
- 设计模式-03工厂方法模式(Factory Method Pattern)
插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背 ...
- 【设计模式】工厂方法模式 Factory Method Pattern
在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...
- 二十四种设计模式:工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...
- 设计模式之工厂方法模式(Factory Method Pattern)
一.工厂方法模式的诞生 在读这篇文章之前,我先推荐大家读<设计模式之简单工厂模式(Simple Factory Pattern)>这篇文档.工厂方法模式是针对简单工厂模式中违反开闭原则的不 ...
- 设计模式之 - 工厂方法模式 (Factory Method design pattern)
1. 模式意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 2. 别名(Virtual Constructor) 3. 结构 4. 工厂方法模式C ...
- 【UE4 设计模式】工厂方法模式 Factory Method Pattern 及自定义创建资源
概述 描述 又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式,或者多态工厂(Polymorphic Factory)模式 工厂父类负责定义创建产品对象的公共接口,而工厂子类 ...
- 工厂方法模式-Factory Method(Java实现)
工厂方法模式-Factory Method 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法让实例化的具体内容交给子类工厂来进行. 本文中的例子是这样的. 生产一个身份证, ...
- 浅谈C++设计模式之工厂方法(Factory Method)
为什么要用设计模式?根本原因是为了代码复用,增加可维护性. 面向对象设计坚持的原则:开闭原则(Open Closed Principle,OCP).里氏代换原则(Liskov Substitution ...
- IOS设计模式浅析之工厂方法模式(Factory Method)
概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...
随机推荐
- 关于 VS 调用存储过程加载很慢和SQL 执行很快的那些事
执行同样的存储过程,调用同样的参数 在VS 中调用存储过程和传参后,到数据加载需要20秒或更多, 在SQL直接调用则不到一秒,同一个存储过程为什么有这么大的区别呢? 原因:存储过程计划失效的原因 产生 ...
- 好用的sublime插件以及快捷键
管理插件:使用Ctrl+`(Esc键下方)快捷键或者通过View->Show Console菜单打开命令行 import urllib.request,os,hashlib; h = '2915 ...
- px-em-rem单位转换
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- vuecli开发项目,文件打包后,appjs/vendorjs文件过大
项目上线后,浏览器第一次加载会特别特别慢,network中看到vendorjs文件1.9M,不慢才怪. echarts按需引入后,也有1.1M左右,由于对vue脚手架理解不深,自己扒了大量的文档,又测 ...
- MarkDown语法和使用
MarkDown语法: Markdown在线编辑器 MdEditor Markdown 语法整理大集合2017 MarkDown 数学公式 在Markdown中输入数学公式(MathJax) \(\l ...
- 微信小程序,获取点击元素的索引值index
1.需求说明 点击 “加号图片” 上传图片,需要知道点击的是第几个图片,动态的修改src数组,这里图片用的 wx:for 循环出来的 2.遇到问题 按照官方最新文档循环的方式,索引值是以 wx:fo ...
- 抓包工具的感触(charles and fiddler)
最近测mobile,一直徘徊在fiddler 和 charles之间: charles 的证书装了 ,才能正常抓包: 后来因为重定向,分享到扣扣,微信的跳转功能,跳转到wap 或者跳转到PC 或者跳 ...
- python3虚拟环境应用
python3自带虚拟环境venv,大致操作只有三步 1. 创建虚拟环境 python3 -m venv venv(名称随意) 2. 激活虚拟环境 source venv/bin/activate 3 ...
- CKplayer:视频推荐和分享插件设置
如果想去掉播放结束后显示精彩视频推荐的插件,可以打开ckplayer.js和ckplayer.xml,找到以下代码,然后注释掉即可: control_rel: 'related.swf,ckplaye ...
- Shiro-工作流程
[与Web集成] 1.Shiro 提供了与 Web 集成的支持,其通过一个ShiroFilter 入口来拦截需要安全控制的URL,然后进行相应的控制. 2.ShiroFilter 类似于如 Strut ...