前言
在程序开发中,设计模式是很容易被开发者所忽视的知识点。初级开发者重点在实战,而且段位不高,有些设计模式的精髓很难理解。但是中级以上开发者,或者对自己代码要求比较高,想要写出更有拓展性,更具维护性的代码。设计模式的学习就不可忽视。它能给予你一些特殊场景的解决方案,并引导你写出更高质量的代码。
设计模式分类
一、根据作用范围划分
根据设计模式作用范围,即主要作用在类上还是对象上来划分,可将设计模式分为类模式和对象模式两种。
类模式:用来处理类与类之间的关系,通过继承而来,这些关系是静态的,编译时便确定下来。在 23 种设计模式中有工厂方法模式、适配器模式、模板方法模式和解释器模式一共 4 种属于类模式。
对象模式:用来处理对象与对象之间的关系,通过组合或者聚合来实现的。这些关系是动态的,在运行时可以变化。除了以上 4 种类模式以外的其他 19 种设计模式都属于对象模式。
二. 根据目的划分
根据设计模式的目的,即设计模式是用来完成什么工作来划分,可将设计模式分为创建型设计模式、结构型设计模式、行为型设计模式。
创建型设计模式:创建型设计模式指的是将对象的创建和使用分离。属于创建型设计模式的有单例模式、原型模式、工厂模式、抽象工厂模式以及建造者模式一共 5 种。
1. 单例模式:简单的说就是一个类只能有一个实例。单例又分为懒汉式单例和饿汉式单例。懒汉式单例是类加载的时候没有创建,使用的时候才创建。饿汉式单例是类一旦加载,实例就已经被创建了。
2. 原型模式:用一个已经创建的实例作为原型,通过复制该原型对象来创建许多和原型相同或相似的新对象。
3. 工厂方法模式:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作放到具体子工厂去实现。
4. 抽象工厂模式:提供一组相关或相互依赖对象的接口。抽象工厂模式是工厂方法模式的升级版,工厂方法模式只生产一类产品。而抽象工厂模式可生产多种类型的产品。
5. 建造者模式:将一个复杂对象的构造和它的表现分离。使同样的构建过程可以创建不同的表示。将复杂的对象分解成一个个简单的对象,然后一步步构建而成。将变与不变分离,产品的组成部分是不变的,但每一部分是可以灵活选择的。
结构型设计模式:结构型设计模式指的是如何将类与对象按照某个组合组成更大的结构。属于结构型设计模式的是有代理模式、适配器模式、装饰者模式、桥接模式、外观模式、享元模式以及组合模式一共 7 种。
6. 代理模式:A与B之间的通信可借助C来完成而达到更好的效果。
7. 适配器模式:调用不同对象的统一接口,如果是外部提供的不同名的接口,就需要适配器来转换。
8. 装饰模式:在不改变对象的基础上,给对象增加格外的功能。
9. 桥接模式:将抽象与实现分离,使他们可以独立化。使用组合关系替代继承关系,降低抽象和实现的耦合。
10. 外观模式:为多个复杂的子系统提供一个统一的接口,使子系统更容易被访问到,降低系统之间的耦合度。
11. 享元模式:享元模式是一种性能优化方案,flyweight 是轻量级,蝇量级的意思。享元模式的核心是利用共享技术有效支持大量类似的颗粒度对象,从而尽可能减少对象的创建,节省内存空间。
12. 组合模式:组合模式又被称为部分-整体模式。它是将对象组合成一个树形结构的模式,使用户对单个对象和组合对象具有一致的访问性。
行为型设计模式:行为型设计模式指的是类与对象如何协作来完成单个对象无法单独完成的任务。属于行为型设计模式的有模板方法模式、策略模式、命令模式、责任链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式一共 11 种。
13. 模板方法模式:模版方法是对封装的一种改造,定义一个抽象的模板,把模板的具体实现放到子类中去完成。即把变化的逻辑增加到子类中,而不改动父类。
14. 策略模式:策略模式就是一种封装,定义一系列算法,并将每个算法封装起来,使它们可以相互替换。算法的变化不会影响使用算法的客户。
15. 命令模式:命令模式指的是执行某些特定事情的指令,或者说实现特定功能的接口约定。
16. 责任链模式:将一系列可以处理请求的对象组成一条链。
17. 状态模式:将某个状态和该状态下的行为抽象出独立的模块。
18. 观察者模式:观察者模式,也叫订阅发布模式,指可以预先订阅事件,在需要的时候进行发布。
19. 中介者模式:提供一个中介者来将对象与对象之间多对多的关系变成一对多的关系,以此来解耦对象的关联性。
20. 迭代器模式:提供一种方法依次访问一个集合对象中的每个元素,并不关心对象的内部结合。
21.访问者模式:将对数据的操作和数据结构进行分离。将对数据中各元素的操作封装成独立的类。使其在不改变数据结构的前提下可以拓展对数据新的操作。
22.备忘录模式:在不破坏对象封装性的前提下,捕捉并保存一个对象的内部状态,以便当需要的时候可以恢复到最初状态。
23. 解释器模式:给分析对象定义一个语言,并定义该语言的文法表示。再设计一个解释器来解释语句中的句子。用编译语言的方式来分析应用中的实例。