什么是设计模式
设计模式是为了重用代码、让人更容易理解代码、保证代码可靠性而总结出来的通用的解决方案。你从来没有学过设计模式,但是遇到类似的问题一定有自己的解决方案,那这个解决方案也算自己的设计模式吧。或者在看到某种设计模式的时候会突然发现,原来自己早就用了传说中的种种设计模式了。一直在使用,只是不知道它还有个名字。
设计模式分类
根据目的
- 创建型:主要用于创建对象
- 结构型:主要用于处理类或对象的组合
- 行为型:主要用于描述对象或对象怎样交互和分配职责
根据范围
- 类模型:处理类和子类之间都得关系,这些关系是过继承简历,在编译时刻就被确定下来,属于静态的。
- 对象模型:处理对象间的关系,这些关系在运行时刻变化,更具动态性。
创建型
简单(静态)工厂:工厂类通过传入的参数决定创建哪种产品类型
定义一个工厂类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,在工厂类中,可以根据参数的不同返回不同类的实例。升级版本简单工厂模式,通过反射根据类的全路径名生成对象。
- 代码可读性更好
- 与使用者代码解耦
抽象工厂:创建相关或依赖对象的家族,而无需明确指定具体类
建造者模式:封装一个复杂对象的构建过程,并可以按步骤构造
- 封装复杂对象的创建过程,使对象使用者不感知复杂的创建逻辑
- 可以一步步按照顺序对成员进行赋值,或者创建嵌套对象,并最终完成目标对象的创建
- 对多个对象复用同样的对象创建逻辑
单例模式:某个类只能有一个实例,提供一个全局的访问点
有一些对象通常我们只需要一个共享的实例,比如线程池、全局缓存、对象池等,这种场景下就适合使用单例模式。
- 限制调用者直接实例化该对象
- 为该对象的单例提供一个全局唯一的访问方法
单例模式有在初始化时机上可以分:
- 饿汉模式:加载是就初始化,即使后续不用也会消耗一定的资源
- 懒汉模式:外部使用的时候才初始化,但初始化时要注意线程安全。golang once天生能处理这种情况。
原型模式:通过复制现有的实例来创建新的实例
原型模式主要解决对象复制的问题,它的核心就是
clone()
方法,返回Prototype
对象的复制品。
结构型
外观模式:对外提供一个统一的方法,来访问子系统中的一群接口
外观模式经常运用于分层架构上,通常我们都会为分层架构中的每一个层级提供一个或多个统一对外的访问接口,这样就能让各个层级之间的耦合性更低,使得系统的架构更加合理。
桥接模式:将抽象部分和它的实现部分分离,使它们都可以独立的变化
桥接模式本质上就是面向接口编程,可以给系统带来很好的灵活性和可扩展性。
组合模式:将对象组合成树形结构以表示“”部分-整体“”的层次结构
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性,组合优于继承。
装饰模式:动态的给对象添加新的功能
使用组合而非继承的方式,能够动态地为本体对象叠加新的行为.从结构上看,装饰模式和代理模式具有很高的相似性,但是两种所强调的点不一样。前者强调的是为本体对象添加新的功能,后者强调的是对本体对象的访问控制。
代理模式:为其他对象提供一个代理以便控制这个对象的访问
使用代理模式的关键在于当Client不方便直接访问一个对象时,提供一个代理对象控制该对象的访问。Client实际上访问的是代理对象,代理对象会将Client的请求转给本体对象去处理。
- 远程代理
- 虚拟代理
- 保护代理
- 缓存代理
- 智能引用
适配器模式:将一个类的方法接口转换成客户希望的另外一个接口
让原本因为接口不匹配而无法一起工作的两个对象能够一起工作。将一个接口
Adaptee
,通过适配器Adapter
转换成Client
所期望的另一个接口Target
来使用,实现原理也很简单,就是Adapter
通过实现Target
接口,并在对应的方法中调用Adaptee
的接口实现。亨元(蝇量)模式:通过共享技术来有效的支持大量细粒度的对象
享元模式摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的内存容量中载入更多对象。
行为型
- 模板模式:定义一个算法结构,而将一些步骤延迟到子类实现
- 解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器
- 策略模式:定义一系列算法,把他们封装起来,并且使它们可以相互替换
- 状态模式:允许一个对象在其对象内部状态改变时改变它的行为
- 观察者模式:对象间的一对多的依赖关系
- 备忘录模式:在不破坏封装的前提下,保持对象的内部状态
- 中介者模式:用一个中介对象来封装一系列的对象交互
- 命令模式:将命令请求封装为一个对象,使得可以用不同的请求来进行参数化
- 访问者模式:在不改变数据结构的前提下,增加作用于一组对象元素的新功能
- 责任链模式:将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会
- 迭代器模式:一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构