整理自李建忠<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++设计模式>视频)的更多相关文章

  1. 学习记录:《C++设计模式——李建忠主讲》1.设计模式

    1.学习目标 1)理解松耦合设计思想: 2)掌握面向对象设计原则: 3)掌握重构技法改善设计: 4)掌握GOF核心设计模式: 2.定义 每个设计模式描述了一个在我们周围不断重复发生的问题,以及该问题解 ...

  2. 学习记录:《C++设计模式——李建忠主讲》2.面向对象设计原则

    1.课程内容: 重新认识面向对象:面向对象设计原则: 2.重新认识面向对象 1)理解隔离变化:从宏观层面来看,面向对象的构建方式更能适应软件的变化,将变化所带来的影响减为最小: 2)各司其职:从微观层 ...

  3. 学习记录:《C++设计模式——李建忠主讲》3.“组件协作”模式

    “组件协作”模式:现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式.典型模式:Template M ...

  4. 学习记录:《C++设计模式——李建忠主讲》6.“状态变化”模式

    状态变化模式:在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定.状态变化模式为这一问题提供了一种解决方案. 典型模式:状态模式(State).备忘录 ...

  5. 学习记录:《C++设计模式——李建忠主讲》5.“对象性能”模式

    对象性能模式:面向对象很好地解决了抽象地问题,但是必不可免地要付出一定地代价.对于通常情况来讲,面向对象地成本大都可以忽略不计,但某些情况,面向对象所带来地成本必须谨慎处理. 典型模式:单件模式(Si ...

  6. 学习记录:《C++设计模式——李建忠主讲》4.“单一职责”模式

    单一职责模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式:装饰模式(Decorator).桥 ...

  7. 学习记录:《C++设计模式——李建忠主讲》7.“领域规则”模式

    领域规则模式:在特定领域中,某些变化虽然频繁,但可以抽象为某种规则.这时候,结合特定的领域,将问题抽象为语法规则,从而给出该领域下的一般性解决方案. 典型模式:解释器模式(Interpreter). ...

  8. C++设计模式——简单工厂模式

    简单工厂模式(Simple Factory Pattern) 介绍:简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用 ...

  9. .NET设计模式: 工厂模式

    .NET设计模式: 工厂模式(转) 转自:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html   .NET设计模式(1): ...

随机推荐

  1. c++中strcmp,strcopy函数的使用

    1.strcmp(str1,str2) C/C++函数,比较两个字符串, 设这两个字符串为str1,str2,若str1==str2,则返回零:若str1<str2,则返回负数:若str1> ...

  2. 拖动水滴给土地浇水(CocosCreator)

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321 一.前沿       最近在做农场的模块,需要实现拖动水滴图标(

  3. GCN和GCN在文本分类中应用

    1.GCN的概念        传统CNN卷积可以处理图片等欧式结构的数据,却很难处理社交网络.信息网络等非欧式结构的数据.一般图片是由c个通道h行w列的矩阵组成的,结构非常规整.而社交网络.信息网络 ...

  4. CSAPP - Ch 1 - 计算机系统漫游

    目录 0 序言及摘要 1 信息就是位+上下文 2 程序被其他程序翻译成不同的格式 3 了解编译系统如何工作是大有益处的 0 序言及摘要 (1) 序言: CS:APP -- Computer Syste ...

  5. Oracle - 获取当前周别函数

    CREATE OR REPLACE FUNCTION GET_WEEK (V_RQ in DATE) return varchar2 as str varchar2(); str1 varchar2( ...

  6. 网页播放摄像头视频一种新的实现方式(非ocx方式)

    前言 出于安全性考虑,浏览器对网页调用本地资源做了诸多限制.单纯的js是不能调用本地摄像头的,最常用的解决方案是通过ocx来实现.ocx是IE浏览器的扩展插件,并不是通用标准,很多浏览器并不支持ocx ...

  7. Codefroces 920F SUM and REPLACE(线段树)

    SUM and REPLACE 题意:给你n个数,进行m次操作,分别是将区间[l,r]内的所有数替换成自己的因子数 和 对区间[l,r]进行求和. 题解:可以发现2的因子个数还是2,1的因子个数还是1 ...

  8. Atcoder D - 3N Numbers(优先队列+dp)

    题目链接:http://abc062.contest.atcoder.jp/tasks/arc074_b 题意:给出3*n个数要求去掉n个数使得剩下的前n个数-后n个数的差最大. 题解:显然是一道如果 ...

  9. codeforces 798 D. Mike and distribution(贪心+思维)

    题目链接:http://codeforces.com/contest/798/problem/D 题意:给出两串长度为n的数组a,b,然后要求长度小于等于n/2+1的p数组是的以p为下表a1-ap的和 ...

  10. hdu 2895 01背包 Robberies

    Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...