设计模式总结 - STEMHA's Blog

设计模式总结

设计模式是什么?

基础概念

设计模式(Design pattern):

  • 是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
  • 是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。

GOF(Gang of Four)

1994 年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。
他们所提出的设计模式主要是基于以下的面向对象设计原则:

  • 对接口编程而不是对实现编程。
  • 优先使用对象组合而不是继承。

为什么要用设计模式?

  • 为了重用代码
  • 让代码更容易被他人理解
  • 保证代码可靠性。

设计模式在软件开发中的两个主要用途:

  • 开发人员的共同平台,提供了一个标准的术语系统,且具体到特定的情景。
    • 例如,单例设计模式意味着使用单个对象,这样所有熟悉单例设计模式的开发人员都能使用单个对象,并且可以通过这种方式告诉对方,程序使用的是单例模式。
  • 最佳的实践
    • 设计模式已经经历了很长一段时间的发展,它们提供了软件开发过程中面临的一般问题的最佳解决方案。学习这些模式有助于经验不足的开发人员通过一种简单快捷的方式来学习软件设计。

设计模式有哪些?

共有 23 种设计模式,可以分为三类:

  • 创建型模式(Creational Patterns) 提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
  • 结构型模式(Structural Patterns) 用于在许多不同的对象之间形成大型对象结构,关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
  • 行为型模式(Behavioral Patterns) 关注对象之间的通信,用于管理对象之间的算法、关系和职责。

创建型模式

单例模式(Singleton Pattern)

单例模式-菜鸟教程
目的:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
何时使用:当您想控制实例数目,节省系统资源的时候。
面临的问题:一个全局使用的类频繁地创建与销毁。
解决方案判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
优点

  1. 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
  2. 避免对资源的多重占用(比如写文件操作)。

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
应用实例
1、一个班级只有一个班主任。
2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
使用场景
1、要求生产唯一序列号。
2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
实现方式:
《设计模式》一书中给出了一种很不错的实现,定义一个单例类,使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法获取该实例。

常见的单例模式分为两种
1、饿汉式:即类产生的时候就创建好实例对象,这是一种空间换时间的方式
2、懒汉式:即在需要的时候,才创建对象,这是一种时间换空间的方式
【C++】单例模式/工厂模式

工厂模式(Factory Pattern)

设计模式之工厂模式(factory pattern)讲的很形象
工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式。
工厂模式-菜鸟教程
提供了一种创建对象的最佳方式,创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
目的:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程(类的实例化)延迟到子类进行。
何时使用:我们明确地计划不同条件下创建不同实例时。
面临的问题

抽象工厂模式(Abstract Factory Pattern)

根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。
是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

建造者(生成器)模式(Builder Pattern)

使用多个简单的对象一步一步构建成一个复杂的对象。
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

原型模式(Prototype Pattern)

用于创建重复的对象,同时又能保证性能。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。
其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。

深拷贝与浅拷贝

浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。

深拷贝:把要复制的对象所引用的对象都复制一遍。深拷贝把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

结构型模式

适配器模式(Adapter Pattern)

作为两个不兼容的接口之间的桥梁。
将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

桥接模式(Bridge Pattern)

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

装饰者模式(Decorator Pattern)

允许向一个现有的对象添加新的功能,同时又不改变其结构。作为现有的类的一个包装。
动态地给一个对象添加一些额外的职责。就扩展功能而言,它比生成子类方式更为灵活。

组合模式(Composite Pattern)

将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。

外观模式(Facade Pattern)

隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
为子系统中的一组接口提供一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

享元模式(Flyweight Pattern)

用于减少创建对象的数量,以减少内存占用和提高性能。
尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
运用共享技术有效地支持大量细粒度的对象。

代理模式(Proxy Pattern)

为其他对象提供一个代理以控制对这个对象的访问。

行为型模式

模版方法模式(Template Method Pattern)

设计模式 - 模板方法.
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
比如冲咖啡和冲茶都有类似的流程,但是某些步骤会有点不一样,要求复用那些相同步骤的代码。

命令模式(Command Pattern)

设计模式 - 命令模式
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

迭代器模式(Iterator Pattern)

提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

观察者模式(Observer Pattern)

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。

中介者模式(Mediator Pattern)

用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。

备忘录模式 (Memento Pattern)

保存一个对象的某个状态,以便在适当的时候恢复对象。
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

解释器模式(Interpreter Pattern)

为语言创建解释器,通常由语言的语法和语法分析来定义。
给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。

状态模式(State Pattern)

类的行为是基于它的状态改变的。
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。

策略模式(Strategy Pattern)

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户端。

职责链模式 (Chain of Responsibility Pattern)

为请求创建了一个接收者对象的链,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

访问者模式 (Visitor Pattern)

使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

参考资料

设计模式之工厂模式(factory pattern)
《大话设计模式》读书笔记
设计模式-菜鸟教程
C++ 设计模式-CSDN
【C++】单例模式/工厂模式
C++中的单例模式和工厂模式

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×