工厂模式(整理自李建忠<C++设计模式>视频)
整理自李建忠<C++设计模式>视频
一.导入:"对象创建"模式和工厂模式
工厂模式只是该模式下的一种.


二.举例说明
有这样一个场景:需要在MainForm中设计一个按钮,这个按钮具有文件分割的功能,支持多种类型的文件分割,比如二进制,文本类型.
不使用工厂模式的设计场景:
MainForm.cpp:
class MainForm
{
public:
MainForm() {
} void Btn1Click()
{
#if 0
//方式1
BinarySplit binarySplit;
binarySplit.SplitFunc();
#else
//方式2
ISplit *splitter = new BinarySplit();
splitter->SplitFunc();
#endif
}
};
Split.hpp
#pragma once
#include"stdio.h"
//抽象基类
class ISplit
{
public:
ISplit() {}
virtual ~ISplit() {} virtual void SplitFunc() = ;
}; //具体类
class BinarySplit :public ISplit
{
public:
void SplitFunc()
{
printf("This is BinarySplit\n");
}
}; class TxtSplit : public ISplit
{
public:
void SplitFunc()
{
printf("This is TxtSplit\n");
}
};
可以看到即便是Split.cpp中使用了多态的方法,在MainForm.cpp中的Btn1Click()还是会依赖于具体的类型,如果要实现别的类的切割函数,就需要在函数里添写,很不符合代码的复用性.
引入工厂模式后的场景:
Split.hpp保持不变
增加SplitFactory.hpp文件
#include"Split.hpp"
//工厂基类
class ISplitFactory
{
public:
ISplitFactory() { }
virtual ~ISplitFactory()
{ } virtual ISplit *CreateSplitter() = ;
}; //具体工厂
class BinarySplitFactory : public ISplitFactory
{
public:
ISplit *CreateSplitter()
{
return new BinarySplit();
}
}; class TxtSplitFactory : public ISplitFactory
{
public:
ISplit *CreateSplitter()
{
return new TxtSplit();
}
};
修改MainForm.cpp文件.
#include"Split.hpp"
#include"SplitFactory.hpp" class MainForm
{
public:
ISplitFactory *splitFactory;
MainForm(ISplitFactory *splitFactory) {
this->splitFactory = splitFactory;
} void Btn1Click()
{
ISplit *splitter = splitFactory->CreateSplitter();//通过工厂模式做成了"多态new"
splitter->SplitFunc();
} };
这里增加的工厂基类同样定义了一个纯虚函数,用来创建Split对象,而实现的过程在子类中进行实现,这样的话就相当于延迟到子类.
上面的情况在MainForm.cpp中通过接受传递过来的splitFactory来确定运行时应该执行谁的函数.在这种模式下,对具体类型的依赖被放到了外边了,而上述代码里面不再存在依赖.
此时的main函数:
int main()
{
ISplitFactory *splitFactory = new BinarySplitFactory();
MainForm mf(splitFactory);
mf.Btn1Click();
return ;
}
//注:这里没有考虑内存管理,正常应该在析构函数中delete掉堆上的内存
三.结构总结
红色的部分是稳定的,蓝色的部分是变化的.让MainForm依赖红色的.


工厂模式(整理自李建忠<C++设计模式>视频)的更多相关文章
- 学习记录:《C++设计模式——李建忠主讲》1.设计模式
1.学习目标 1)理解松耦合设计思想: 2)掌握面向对象设计原则: 3)掌握重构技法改善设计: 4)掌握GOF核心设计模式: 2.定义 每个设计模式描述了一个在我们周围不断重复发生的问题,以及该问题解 ...
- 学习记录:《C++设计模式——李建忠主讲》2.面向对象设计原则
1.课程内容: 重新认识面向对象:面向对象设计原则: 2.重新认识面向对象 1)理解隔离变化:从宏观层面来看,面向对象的构建方式更能适应软件的变化,将变化所带来的影响减为最小: 2)各司其职:从微观层 ...
- 学习记录:《C++设计模式——李建忠主讲》3.“组件协作”模式
“组件协作”模式:现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式.典型模式:Template M ...
- 学习记录:《C++设计模式——李建忠主讲》6.“状态变化”模式
状态变化模式:在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定.状态变化模式为这一问题提供了一种解决方案. 典型模式:状态模式(State).备忘录 ...
- 学习记录:《C++设计模式——李建忠主讲》5.“对象性能”模式
对象性能模式:面向对象很好地解决了抽象地问题,但是必不可免地要付出一定地代价.对于通常情况来讲,面向对象地成本大都可以忽略不计,但某些情况,面向对象所带来地成本必须谨慎处理. 典型模式:单件模式(Si ...
- 学习记录:《C++设计模式——李建忠主讲》4.“单一职责”模式
单一职责模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式:装饰模式(Decorator).桥 ...
- 学习记录:《C++设计模式——李建忠主讲》7.“领域规则”模式
领域规则模式:在特定领域中,某些变化虽然频繁,但可以抽象为某种规则.这时候,结合特定的领域,将问题抽象为语法规则,从而给出该领域下的一般性解决方案. 典型模式:解释器模式(Interpreter). ...
- C++设计模式——简单工厂模式
简单工厂模式(Simple Factory Pattern) 介绍:简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用 ...
- .NET设计模式: 工厂模式
.NET设计模式: 工厂模式(转) 转自:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html .NET设计模式(1): ...
随机推荐
- 2013-2014 ACM-ICPC Pacific Northwest Regional Contest D.Delta Quadrant
题意略. 思路: 由于这是一颗无根树,我们可以贪心地来删去边. 详见代码: #include<bits/stdc++.h> using namespace std; typedef lon ...
- 【原创】(二)Linux物理内存初始化
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- ES5新增数组的一些方法
1.Array.indexof(value1,value2) Tip:用于返回某个数组或字符串中规定字符或者字符串的位置. (1)当Array.indexof(value1);里面只有一个值的时候,表 ...
- 持续集成高级篇之Jenkins资源调度
系列目录 之前的示例我们主要关注点在于功能的实现,都是在一个节点的完成了.有了多个节点后,必须涉及到资源的调度问题.本节我们讲解在创建任务时与资源调度的有关选项以及一些平时没有注意到的但在生产环境需要 ...
- hdu-6601 Keen On Everything But Triangle
题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=6601 Description N sticks are arranged in a row, and ...
- react-router url参数更新 但是页面不更新的解决办法
今天发现, 当使用react-router(v4.2.2)时,路由需要传入参数, 但是如果路由跳转时,url仅仅改变的是参数部分,如从hello/1跳转到hello/2,此时虽然参数更新了,但是页面是 ...
- Erlcron分析学习
介绍 Erlcron实现类似Linux下面的cron的计划任务. 源码下载地址:https://github.com/erlware/erlcron 原理 Erlcron进程监控树 ecrn_cron ...
- SpringBoot 参数校验的方法
Introduction 有参数传递的地方都少不了参数校验.在web开发中,前端的参数校验是为了用户体验,后端的参数校验是为了安全.试想一下,如果在controller层中没有经过任何校验的参数通过s ...
- 【Redis】主从复制
一.概述 1.redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从 ...
- lambda表达式不同对象根据对象某个属性去重
1.有时候有两个list对象,我们想要去重,比如: List<User> userList和List<Person>personList 想通过User的id和Person的i ...