C++ 常见设计模式理解

244 阅读4分钟

一共有23类设计模式,这里记录比较常用的几种适配器模式。

image.png

[创建型]设计模式

1.1 工厂模式

对于工厂类来说,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成。

  1. 简单工厂就是一个函数或者类,根据输入参数的不同,其内部创建了不同的产品。
  2. 工厂方法来看,比简单工厂更加复杂,就是有不同的工厂,不同的工厂根据输入的参数返回固定类型的产品,一般来说就是一个工厂对应一类产品。
  3. 抽象工厂方法来看,比(2)的应用场景更加复杂,可以有一个工厂对应多种产品的现象。

总结来看:工厂方法都是把产品的创建封装起来,用户只需要考虑输入参数,就可以得到不同的产品,这要就不用暴露代码内部的接口,使得开发更加简单。

(1)简单工厂模式

image.png

(2)工厂方法模式

image.png

(3)抽象工厂模式

image.png

1.2 单例设计模式

对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。

单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。

缺点:

  • 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
  • 单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。
  • 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;现在很多面向对象语言(如Java、C#)的运行环境都提供了自动垃圾回收的技术,因此,如果实例化的对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源,下次利用时又将重新实例化,这将导致对象状态的丢失。

饿汉式

参考自参考资料[3],实现思路:构造方法私有化/或者保护,外部无法new对象,同时提供一个GetInstance方法,在运行时就全局创建。

缺点是:程序启动的时候,对象就被创建,消耗资源。

image.png

懒汉式(线程安全/不安全)

参考自参考资料[4],实现思路:构造方法私有化/保护,同时有一个私有指针,提供GetInstance方法,并且由GetInstance方法new对象,new对象之前,先判断私有指针是不是NULL。

双重检查锁技术

双重检查锁定在懒汉式的基础上做了进一步的优化,既保证了懒加载,又保证了线程安全,同时减少了锁的粒度,提高了性能。

image.png

[结构型]设计模式

2.1 适配器模式

适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)

直观的理解,适配器可以把多个接口给封装成同一个,然后在内部进行逻辑选择。(同样也是不需要暴露内部的接口,使得开发更加简单)

[行为型]设计模式

3.1 命令模式

参考资料

  1. 图说设计模式 — Graphic Design Patterns (design-patterns.readthedocs.io)

  2. JackChan1999/DesignPattern: 23种设计模式,Android源码设计模式分析 (github.com)

  3. jaredtao/DesignPattern: C++11全套设计模式-23种指针的用法(a full DesignPattern implement with c++11) (github.com)

  4. chouxianyu/design-patterns-cpp: C++面向对象设计模式-文档与代码 (github.com)