C语言设计模式

合集下载

c语言系统设计方案

c语言系统设计方案

c语言系统设计方案
1. 需求分析:明确系统的功能和性能要求,确定系统的边界和约束条件。

2. 设计系统架构:选择合适的架构模式,如分层架构、模块化架构等,确保系统具有良好的可扩展性和可维护性。

3. 定义数据结构:根据系统的需求,设计合适的数据结构,用于存储和操作系统中的数据。

4. 设计算法:根据系统的功能要求,设计高效、准确的算法,以实现系统的核心逻辑。

5. 编写模块:将系统划分为多个功能模块,按照模块进行编码实现,每个模块应该具有单一的职责,并且代码应该易于理解和维护。

6. 测试与调试:编写测试用例,对系统进行全面的测试,确保系统的正确性和稳定性。

同时,对发现的问题进行调试和修复。

7. 文档编写:编写详细的系统设计文档和用户手册,以便于后续的开发和维护。

8. 优化与改进:根据实际运行情况,对系统进行性能优化和功能改进,以提高系统的效率和用户体验。

9. 发布与维护:将系统发布到生产环境,并提供相应的维护和支持服务,及时处理用户反馈的问题和建议。

以上是一个基本的 C 语言系统设计方案,实际的系统设计过程可能会根据具体需求和项目规模进行调整和扩展。

c课程设计设计模式

c课程设计设计模式

c 课程设计设计模式一、教学目标本课程旨在让学生掌握设计模式的基本概念、原则和常见的设计模式,培养学生运用设计模式解决实际问题的能力。

通过本课程的学习,学生将能够:1.理解设计模式的基本概念、原则和分类;2.熟悉常见的设计模式及其应用场景;3.能够运用设计模式解决实际问题,提高代码的可维护性和可扩展性。

二、教学内容本课程的教学内容主要包括设计模式的基本概念、原则、常见的设计模式及其应用。

具体安排如下:1.设计模式的基本概念:介绍设计模式的定义、目的和分类;2.设计模式的原则:讲解设计模式遵循的原则,如SOLID原则;3.常见的设计模式:介绍常见的设计模式,如单例模式、工厂模式、观察者模式等,并分析其应用场景;4.设计模式的运用:通过实际案例,讲解如何运用设计模式解决实际问题。

三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,如讲授法、讨论法、案例分析法等。

具体如下:1.讲授法:讲解设计模式的基本概念、原则和常见的设计模式;2.讨论法:学生分组讨论设计模式的优缺点及应用场景;3.案例分析法:分析实际案例,引导学生学会运用设计模式解决实际问题。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:选用权威、实用的设计模式教材;2.参考书:提供设计模式相关的参考书籍,以便学生课后深入研究;3.多媒体资料:制作精美的PPT,便于学生理解和记忆;4.实验设备:提供计算机实验室,便于学生实践和实验。

五、教学评估本课程的教学评估将采用多元化的评价方式,包括平时表现、作业、考试等,以全面、客观、公正地评估学生的学习成果。

具体评估方式如下:1.平时表现:通过课堂参与、提问、小组讨论等环节,评价学生的学习态度和课堂表现;2.作业:布置适量的课后作业,检查学生对知识点的理解和应用能力;3.考试:设置期中考试和期末考试,以检验学生对本课程知识的掌握程度。

C语言设计模式

C语言设计模式

目录1.C语言设计模式(开篇) (2)2.C语言和设计模式(继承、封装、多态) (3)2.1继承性 (3)2.2封装性 (4)2.3多态 (4)3.单件模式 (4)4.工厂模式 (5)5.抽象工厂模式 (6)6.访问者模式 (8)7.状态模式 (9)8.命令模式 (9)9.解释器模式 (10)10.备忘录模式 (11)11.观察者模式 (12)12.桥接模式 (12)13.建造者模式 (13)14.中介者模式 (14)15.策略模式 (15)16.适配器模式 (16)17.装饰模式 (17)18.亨元模式 (17)19.代理模式 (18)20.外观模式 (19)21.迭代器模式 (20)22.责任链模式 (21)23.模版模式 (22)24.组合模式 (24)25.原型模式 (25)1.C语言设计模式(开篇)关于软件设计方面的书很多,比如《重构》,比如《设计模式》。

至于软件开发方式,那就更多了,什么极限编程、精益方法、敏捷方法。

随着时间的推移,很多的方法又会被重新提出来。

其实,就我个人看来,不管什么方法都离不开人。

一个人写不出二叉树,你怎么让他写?敏捷吗?你写一行,我写一行。

还是迭代?写三行,删掉两行,再写三行。

项目的成功是偶然的,但是项目的失败却有很多原因,管理混乱、需求混乱、设计低劣、代码质量差、测试不到位等等。

就软件企业而言,没有比优秀的文化和出色的企业人才更重要的了。

从软件设计层面来说,一般来说主要包括三个方面:(1)软件的设计受众,是小孩子、老人、女性,还是专业人士等等;(2)软件的基本设计原则,以人为本、模块分离、层次清晰、简约至上、适用为先、抽象基本业务等等;(3)软件编写模式,比如装饰模式、责任链、单件模式等等。

从某种意义上说,设计思想构成了软件的主题。

软件原则是我们在开发中的必须遵循的准绳。

软件编写模式是开发过程中的重要经验总结。

灵活运用设计模式,一方面利于我们编写高质量的代码,另一方面也方便我们对代码进行维护。

C语言模块化程序设计

C语言模块化程序设计

C语言模块化程序设计模块化程序设计是一种将程序分解为独立模块的方法,每个模块具有明确定义和特定功能。

使用模块化程序设计可以提高程序的可维护性、可扩展性和可重用性。

本文将介绍C语言中的模块化程序设计的原则、方法和优势。

首先,要进行模块化程序设计,需要遵循以下原则:1.单一职责原则:每个模块应该只负责一个具体的功能或任务。

这样可以使模块的功能更加明确和独立,并且方便后续的维护和测试。

2.高内聚,低耦合:模块内部的各个部分应该紧密地关联在一起,形成一个功能完整的整体,同时与其他模块的耦合度应该尽量降低,以减少模块间的相互影响和依赖性。

接下来,我们将介绍几种常见的模块化程序设计的方法:1.函数模块化:将功能相似的代码封装在一个函数中,便于重复使用和集中管理。

函数模块化可以提高程序的可读性和可维护性。

2.文件模块化:将具有相关功能的函数、常量和数据结构定义放在同一个文件中,并通过头文件进行声明和引用。

文件模块化可以使代码结构清晰,提高代码的复用性。

3.类模块化:将相关的函数和数据结构封装在一个类中,并通过类的接口来访问和操作。

类模块化可以提供更高级别的封装和抽象,方便程序的组织和管理。

4.动态链接库和静态链接库:将功能模块封装为独立的动态链接库或静态链接库,以供其他程序调用和使用。

链接库模块化可以提高代码的复用性和可移植性。

以上是常见的模块化程序设计方法,可以根据具体的需求和场景选择适合的方法。

无论使用哪种方法,模块化程序设计都可以带来以下几个优势:1.可维护性:模块化的程序结构使程序的各个部分相互独立,修改和维护一个模块时,不会对其他模块造成影响,降低了维护的难度。

2.可重用性:模块化的程序结构使得代码片段可以在多个地方反复使用,提高了代码的复用性,减少了重复编写代码的工作量。

3.可扩展性:由于模块之间的低耦合性,当需要添加新的功能时,可以通过增加新的模块来实现,而不需要修改已有的模块,降低了扩展的成本和风险。

C语言设计模式

C语言设计模式

C++有三个最重要的特点,即继承、封装、多态。

我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性。

(1)继承性[cpp]view plaincopy1.typedef struct _parent2.{3.int data_parent;4.5.}Parent;6.7.typedef struct _Child8.{9.struct _parent parent;10.int data_child;11.12.}Child;在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。

这样,不管是数据的访问、数据的强转、数据的访问都不会有什么问题。

(2)封装性[cpp]view plaincopy1.struct _Data;2.3.typedef void (*process)(struct _Data* pData);4.5.typedef struct _Data6.{7.int value;8. process pProcess;9.10.}Data;封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。

这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。

封装性,这是类拥有的属性,当然也是数据结构体拥有的属性。

(3)多态[cpp]view plaincopy1.typedef struct _Play2.{3.void* pData;4.void (*start_play)(struct _Play* pPlay);5.}Play;多态,就是说用同一的接口代码处理不同的数据。

比如说,这里的Play结构就是一个通用的数据结构,我们也不清楚pData是什么数据,start_play是什么处理函数?但是,我们处理的时候只要调用pPlay->start_play(pPlay)就可以了。

剩下来的事情我们不需要管,因为不同的接口会有不同的函数去处理,我们只要学会调用就可以了。

C语言的设计模式-依赖倒置

C语言的设计模式-依赖倒置
printf("Terminal1_display \r\n"); }
Terminal_t init_Terminal1() {
Terminal_t t; t.display = Terminal1_display; return t; }
3:客户端:
Terminal_t t; t = init_Terminal1(); t.display();
cannotreadpropertyencryptionofnull请尝试刷新页面或更换浏览器重试
C语言的设计模式 -依赖倒置
依赖倒置:就是要依赖于抽象,不要依赖于具体。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块 间的耦合。
假设一个客户端可以根据不同的终端智能显示,面向过程的处理流程结构图如下:
客户端代码流程如下:
if (type == Teminal1) {
T1_disply(); } else if(type == Teminal2) {
T2_disply(); }
功能实现没有任何问题,考虑到软件的扩展如果增加一个新的终端我们再客户端的流程中就要加一个判断分支,如果系统够复杂后果往往是 在流程中遍布判断,对后期的开发、维护都是艰巨的任务。产生这种结果的原因是业务依赖了底层的具体实现,两者完全耦合在一起。我们 需要依赖一个稳定的接口。在面向对象的语言比如JAVA,接口在语言级别都是支持的,实现起来相对直观,但只要理解了设计的本质,在 C中实现接口依赖也很容易。修改一下设计,在业务和底层间增加一个接口层:
可以看到我们在业务层和底层间定义了ITerminal.h这个接口层,业务和底层都依赖这个接口,如果新增了终端在客户端完全感知不到,客户 端只知道display这个接口。

c语言模块化设计思路

c语言模块化设计思路
C语言的模块化设计是指将程序分解为多个模块或函数,以便
提高代码的可维护性、可读性和重用性。

在C语言中,实现模块化
设计的方法包括使用函数、文件分割和头文件等。

下面我会从多个
角度来详细解释C语言的模块化设计思路。

首先,模块化设计可以通过函数来实现。

在C语言中,函数是
模块化设计的基本单元。

通过将功能相近的代码封装到一个函数中,可以使代码更加清晰和易于理解。

这样的设计还能够提高代码的重
用性,因为可以在不同的地方调用同一个函数来实现相同的功能,
而不需要重复编写相同的代码。

其次,C语言的模块化设计也可以通过文件分割来实现。

将相
关的函数或变量放到同一个文件中,可以使代码的组织更加清晰。

这种方法也有利于团队合作,因为不同的开发人员可以负责不同的
文件,而不会相互干扰。

另外,文件分割还可以减小编译时间,因
为只有当某个文件发生改动时,才需要重新编译该文件。

另外,C语言的模块化设计还可以通过头文件来实现。

头文件
通常包含函数声明、宏定义、结构体定义等信息,可以在不同的文
件中被包含和引用。

这样可以将接口和实现分离,提高了代码的可维护性和可读性。

另外,头文件还可以提供对外的接口,隐藏内部实现细节,从而保护代码的安全性。

总的来说,C语言的模块化设计思路是通过函数、文件分割和头文件来将程序分解为多个模块,以提高代码的可维护性、可读性和重用性。

模块化设计能够使程序更加清晰和易于理解,有利于团队合作和代码的维护。

因此,在C语言的开发过程中,模块化设计是非常重要的。

黑马程序员C语言教程:常见的六种设计模式

常见的六种设计模式以及应用场景设计模式是对设计原则的具体化。

用江湖话说就是武林秘籍,总结出来的一些固定套路,可以帮助有根基的程序员迅速打通任督二脉,从此做什么都特别快。

常用的模式及其场景如下。

1) 单例模式。

单例模式是一种常用的软件设计模式。

在它的核心结构中只包含一个被称为单例类的特殊类。

通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。

应用场景:如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

2) 工厂模式。

工厂模式主要是为创建对象提供了接口。

应用场景如下:a. 在编码时不能预见需要创建哪种类的实例。

b. 系统不应依赖于产品类实例如何被创建、组合和表达的细节。

3) 策略模式。

策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换。

此模式让算法的变化独立于使用算法的客户。

应用场景如下。

a. 一件事情,有很多方案可以实现。

b. 我可以在任何时候,决定采用哪一种实现。

c. 未来可能增加更多的方案。

d. 策略模式让方案的变化不会影响到使用方案的客户。

举例业务场景如下。

系统的操作都要有日志记录,通常会把日志记录在数据库里面,方便后续的管理,但是在记录日志到数据库的时候,可能会发生错误,比如暂时连不上数据库了,那就先记录在文件里面。

日志写到数据库与文件中是两种算法,但调用方不关心,只负责写就是。

4) 观察者模式。

观察者模式又被称作发布/订阅模式,定义了对象间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

应用场景如下:a.对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。

b.对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。

5) 迭代器模式。

应用场景如下:当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式。

其实stl容器就是很好的迭代器模式的例子。

C语言设计模式


03 状态机模式
状态机模式1
有一个灯,按下开按钮,就会开灯,按下关按钮就会关灯。这就是一个很典型的简单的有限状态机。简单 的描述有2个状态,关灯[STATE_OFF],亮[STATE_LIGHT_ON] 。有两个事件,开和关按钮。这两个事件 促使状态机间的转换。
03 状态机模式
状态机模式2
有一个灯,按下开按钮,就会开灯,按下关按钮就会关灯。和一般等不同的是,两次开之间的灯的明暗不 一样。也就是说,第一次开的时候,是高亮,关灯后,再开是低亮,下次再开是高亮,循环往复。
命令模式的C语言实现也是非常显性的。命令发送方不通过直接调用的方式,而是通过发一个命令 消息给接收方,让接收方执行操作。C语言里采用命令模式的最常见的原因是核间通信,进程间交互。 如果是核间通信,通常是把命令按协定的格式封装在消息数据包里。如果是进程间通信,通常封装成一 个结构体,把参数带过去。命令的通道通常是队列。
07 适配及系列模式-----总结
非常常用的设计模式,使用中都是自然而然的,没有想到其实也是几种退化的面向对象设计模式。
08 建造者模式----介绍
08 建造者模式----总结
对于C语言开发者来说,通常是在构造复杂的数据结构时候会想到建造者模式。比如核间通信消息,进 程间通信消息。ISP里面的request消息,就隐性用了建造者模式。
。。。
.init
..rreeaadd
.writeLeabharlann .init.read
.write
09 外观模式----总结
引入外观模式,是客户对子系统的使用变得简单了,减少了与子系统的关联对象,实现了子系统与客户之间 的松耦合关系。但是,灵活性变差了,客户不能自由选择子系统内部的接口,只能使用封装好的一套接口。

c语言程序设计方法

c语言程序设计方法C语言是一种广泛应用于软件开发领域的高级编程语言,其简洁、高效和具有较强的可移植性,使其成为许多程序员首选的编程语言之一。

在进行C语言程序设计时,合理的设计方法能够提高代码的质量和可维护性。

本文将介绍几种常用的C语言程序设计方法,以帮助读者更好地进行程序开发。

一、模块化设计模块化设计是一种将程序拆分成多个独立模块的方法。

每个模块都具有特定的功能,通过模块化设计可以提高代码的可读性和重用性。

在C语言中,可以通过建立函数来实现模块化设计。

一个好的模块化设计应该考虑到函数的功能单一性、接口设计的灵活性以及模块之间的高内聚低耦合原则。

二、注释规范注释是程序开发中不可或缺的一部分,良好的注释规范可以使其他开发人员更好地理解代码的逻辑和意图。

在C语言中,可以使用单行注释(//)和多行注释(/* ... */)来添加注释。

在进行注释时,应尽量避免使用无意义的注释,而要注重对代码中关键逻辑或特殊处理的解释。

三、错误处理在程序开发中,错误处理是非常重要的一环。

良好的错误处理能够提高程序的健壮性和可靠性。

C语言提供了多种处理错误的方式,如使用错误码、异常处理等。

在进行错误处理时,首先应该考虑到可能出现的错误情况,然后针对每种情况制定相应的处理策略,以保证程序的正常运行。

四、优化算法在进行C语言程序设计时,算法的优化是一个至关重要的方面。

合理选择和设计算法能够使程序运行效率更高,减少资源的消耗。

在优化算法时,应注意避免过多的嵌套循环和重复计算,尽量使用已有的库函数和数据结构,以提高程序的执行效率。

五、代码风格良好的代码风格能够使程序的阅读和维护更加方便。

在C语言中,可以采用统一的代码缩进、命名规范和注释规范等来确保代码的可读性。

合理选择变量名和函数名,并使用有意义的命名能够提高代码的可理解性。

此外,在书写代码时,要注意代码的排版,以保持整洁美观。

六、调试技巧调试是程序开发中不可避免的一部分。

掌握一些常用的调试技巧能够帮助程序员更快地定位和解决问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录1.C语言设计模式(开篇) (2)2.C语言和设计模式(继承、封装、多态) (3)2.1继承性 (3)2.2封装性 (4)2.3多态 (4)3.单件模式 (4)4.工厂模式 (5)5.抽象工厂模式 (6)6.访问者模式 (8)7.状态模式 (9)8.命令模式 (9)9.解释器模式 (10)10.备忘录模式 (11)11.观察者模式 (12)12.桥接模式 (12)13.建造者模式 (13)14.中介者模式 (14)15.策略模式 (15)16.适配器模式 (16)17.装饰模式 (17)18.亨元模式 (17)19.代理模式 (18)20.外观模式 (19)21.迭代器模式 (20)22.责任链模式 (21)23.模版模式 (22)24.组合模式 (24)25.原型模式 (25)1.C语言设计模式(开篇)关于软件设计方面的书很多,比如《重构》,比如《设计模式》。

至于软件开发方式,那就更多了,什么极限编程、精益方法、敏捷方法。

随着时间的推移,很多的方法又会被重新提出来。

其实,就我个人看来,不管什么方法都离不开人。

一个人写不出二叉树,你怎么让他写?敏捷吗?你写一行,我写一行。

还是迭代?写三行,删掉两行,再写三行。

项目的成功是偶然的,但是项目的失败却有很多原因,管理混乱、需求混乱、设计低劣、代码质量差、测试不到位等等。

就软件企业而言,没有比优秀的文化和出色的企业人才更重要的了。

从软件设计层面来说,一般来说主要包括三个方面:(1)软件的设计受众,是小孩子、老人、女性,还是专业人士等等;(2)软件的基本设计原则,以人为本、模块分离、层次清晰、简约至上、适用为先、抽象基本业务等等;(3)软件编写模式,比如装饰模式、责任链、单件模式等等。

从某种意义上说,设计思想构成了软件的主题。

软件原则是我们在开发中的必须遵循的准绳。

软件编写模式是开发过程中的重要经验总结。

灵活运用设计模式,一方面利于我们编写高质量的代码,另一方面也方便我们对代码进行维护。

毕竟对于广大的软件开发者来说,软件的维护时间要比软件编写的时间要多得多。

编写过程中,难免要有新的需求,要和别的模块打交道,要对已有的代码进行复用,那么这时候设计模式就派上了用场。

我们讨论的主题其实就是设计模式。

讲到设计模式,人们首先想到的语言就是c#或者是java,最不济也是c++,一般来说没有人会考虑到c语言。

其实,我认为设计模式就是一种基本思想,过度美化或者神化其实没有必要。

其实阅读过linux kernel的朋友都知道,linux虽然自身支持很多的文件系统,但是linux自身很好地把这些系统的基本操作都抽象出来了,成为了基本的虚拟文件系统。

举个例子来说,现在让你写一个音乐播放器,但是要支持的文件格式很多,什么ogg,wav,mp3啊,统统要支持。

这时候,你会怎么编写呢?如果用C++语言,你可能会这么写。

class music_file{HANDLE hFile;public:void music_file() {}virtual ~music_file() {}virtual void read_file() {}virtual void play() {}virtual void stop() {}virtual void back() {}virtual void front() {}virtual void up() {}virtual void down() {}};其实,你想想看,如果用C语言能够完成相同的抽象操作,那不是效果一样的吗?typedef struct _music_file{HANDLE hFile;void (*read_file)(struct _music_file* pMusicFile);void (*play)(struct _music_file* pMusicFile);void (*stop)(struct _music_file* pMusicFile);void (*back)(struct _music_file* pMusicFile);void (*front)(struct _music_file* pMusicFile);void (*down)(struct _music_file* pMusicFile);void (*up)(struct _music_file* pMusicFile);}music_file;当然,上面的例子比较简单,但是也能说明一些问题。

写这篇文章的目的一是希望和朋友们共同学习模式的相关内容,另一方面也希望朋友们能够活学活用,既不要迷信权威,也不要妄自菲薄。

只要付出努力,付出汗水,肯定会有收获的。

有些大环境你改变不了,那就从改变自己开始。

万丈高楼平地起,一步一个脚印才能真真实实学到东西。

如果盲目崇拜,言必google、微软、apple,那么除了带来几个唾沫星,还能有什么受用呢?无非白费了口舌而已。

希望和大家共勉。

2.C语言和设计模式(继承、封装、多态)记得还在我们大学C++第一门课的时候,老师就告诉我们说,C++是一门面向对象的语言。

C++有三个最重要的特点,即继承、封装、多态。

等到后来随着编码的增多和工作经验的积累,我也慢慢明白了面向对象的含义。

可是,等我工作以后,使用的编程语言更多的是C语言,这时候我又想能不能把C语言变成面向对象的语言呢?等到后来通过思考和实践,我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性。

2.1继承性typedef struct _parent{int data_parent;}Parent;typedef struct _Child{struct _parent parent;int data_child;}Child;在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。

这样,不管是数据的访问、数据的强转、数据的访问都不会有什么问题。

2.2封装性struct _Data;typedef void (*process)(struct _Data* pData);typedef struct _Data{int value;process pProcess;}Data;封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。

这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。

封装性,这是类拥有的属性,当然也是数据结构体拥有的属性。

2.3多态3.单件模式有过面试经验的朋友,或者对设计模式有点熟悉的朋友,都会对单件模式不陌生。

对很多面试官而言,单件模式更是他们面试的保留项目。

其实,我倒认为,单件模式算不上什么设计模式。

最多也就是个技巧。

单件模式要是用C++写,一般这么写。

#include <string.h>#include <assert.h>class object{public:static class object* pObject;static object* create_new_object(){if(NULL != pObject)return pObject;pObject = new object();assert(NULL != pObject);return pObject;}private:object() {}~object() {}};class object* object::pObject = NULL;单件模式的技巧就在于类的构造函数是一个私有的函数。

但是类的构造函数又是必须创建的?怎么办呢?那就只有动用static函数了。

我们看到static里面调用了构造函数,就是这么简单。

int main(int argc, char* argv[]){object* pGlobal = object::create_new_object();return 1;}4.工厂模式工厂模式是比较简单,也是比较好用的一种方式。

根本上说,工厂模式的目的就根据不同的要求输出不同的产品。

比如说吧,有一个生产鞋子的工厂,它能生产皮鞋,也能生产胶鞋。

如果用代码设计,应该怎么做呢?typedef struct _Shoe{int type;void (*print_shoe)(struct _Shoe*);}Shoe;就像上面说的,现在有胶鞋,那也有皮鞋,我们该怎么做呢?void print_leather_shoe(struct _Shoe* pShoe){assert(NULL != pShoe);printf("This is a leather show!\n");}void print_rubber_shoe(struct _Shoe* pShoe){assert(NULL != pShoe);printf("This is a rubber shoe!\n");}所以,对于一个工厂来说,创建什么样的鞋子,就看我们输入的参数是什么?至于结果,那都是一样的。

#define LEATHER_TYPE 0x01#define RUBBER_TYPE 0x02Shoe* manufacture_new_shoe(int type){assert(LEATHER_TYPE == type || RUBBER_TYPE == type);Shoe* pShoe = (Shoe*)malloc(sizeof(Shoe));assert(NULL != pShoe);memset(pShoe, 0, sizeof(Shoe));if(LEATHER_TYPE == type){pShoe->type == LEATHER_TYPE;pShoe->print_shoe = print_leather_shoe;}else{pShoe->type == RUBBER_TYPE;pShoe->print_shoe = print_rubber_shoe;}return pShoe;}5.抽象工厂模式前面我们写过的工厂模式实际上是对产品的抽象。

对于不同的用户需求,我们可以给予不同的产品,而且这些产品的接口都是一致的。

而抽象工厂呢?顾名思义,就是说我们的工厂是不一定的。

怎么理解呢,举个例子。

假设有两个水果店都在卖水果,都卖苹果和葡萄。

其中一个水果店买白苹果和白葡萄,另外一个水果店卖红苹果和红葡萄。

所以说,对于水果店而言,尽管都在卖水果,但是两个店卖的品种不一样。

既然水果不一样,那我们先定义水果。

typedef struct _Apple{void (*print_apple)();}Apple;typedef struct _Grape{void (*print_grape)();}Grape;上面分别对苹果和葡萄进行了抽象,当然它们的具体函数也是不一样的。

相关文档
最新文档