设计模式

23种设计模式精讲

创建型

单例模式

  • 单例模式的实现一般是私有化构造器,然后非空判断调用静态方法返回实例。单例模式需要解决线程安全问题,因此实例本身需要用volatile关键字实现可见性和禁止重排序,再进行双重验证锁(即对获得实例的方法进行同步,同时两次判断实例是否确定为空,只有确定为空才可以创建实例)
  • 更简单的方式是利用枚举类实现单例模式。枚举类中的每个字段都是私有构造器构造的,同时枚举类只会被初始化一次,因为枚举类中的实例是线程安全的,同时枚举拒绝被反射调用构造器。

工厂模式

工厂模式中有简单工厂、工厂方法、抽象工厂三种变形

  • 简单工厂:将对象的创建封装成方法,根据不同的要求创建不同的类
  • 工厂方法:简单工厂将不同对象的创建全部封装起来,比如美的空调1、海尔空调2、格力空调3都是在一个方法下面实现。而工厂方法将不同对象的创建交给不同的子类
  • 抽象工厂:工厂方法中对应的都是同一等级的子类,比如工厂子类1下面是海尔空调1,工厂子类2下面是美的空调2。工厂方法不适用多家工厂的产品族,比如海尔公司下有空调产品和冰箱产品、美的公司下有空调产品和冰箱产品。抽象工厂将工厂子类对应不同”公司”,每个工厂子类下有不同的产品,比如海尔工厂类下面是创建空调和创建冰箱的方法,美的工厂类下面是创建空调和创建冰箱的方法

原型模式

简单理解原型模式就是克隆,其中克隆又可以分为浅克隆和深克隆

建造者模式

建造者模式封装了类的复杂的创建过程,如果某个类下面有很多字段,比如电脑类下面有cpu、gpu、ram字段等。此时引入Builderl类对类的创建过程进行封装,实际过程是引用电脑类对象,进行字段设置,之后返回电脑类对象。此时又会有一个问题,字段的设置怎么传入呢?这样又引进了director负责对builder进行管理,传入对应字段需要的值。

行为型

观察者模式

观察者模式很好理解。每个主题维护着一群观察者,只要主题状态改变或者发布消息,就调用观察者们的方法进行通知,根据消息的推(推送全部信息)或者拉(只是告知主题更新,观察者自行调用需要的信息),有时还会传入主题对象让观察者自行调用需要的信息。

责任链模式

责任链模式中不同的节点继承于同个抽象类,子类需要自己实现业务逻辑,父类中包含本类的引用,用于设置下一个节点

模板模式

将固定的业务代码在抽象类中,将需要根据子类不同进行实现的代码设为抽象方法交给子类实现。

策略模式

策略模式就是创建一个共同的接口,不同的子类实现该接口,在上层只能看到接口的方法,而接口的实现子类我们可以自由更换并且不影响代码结构

命令模式

实现请求接口,将请求都是实现此接口,把请求都封装成统一的对象。同时创建方法的执行者,其中维护命令集合,将命令氢气请求者与命令的实现者解耦

状态模式

状态模式可以概括为不同的状态执行不同的命令。上下文(Context)中维护着state对象,handle方法中调用state对象的业务代码,实现不同的状态执行不同的命令。具体的State实现state接口进行业务逻辑编写。

中介者模式

中介者维护一组互相交互的对象。常见的中介者就是聊天室了,不同用户进行频繁的交互,聊天室在其中起到转发消息的作用。中介者注册着多个用户,每个用户发送消息的同时告知中介者,由中介者进行转发。

备忘录模式

备忘录模式能记录一个对象的内部状态,当用户后悔时能撤销当前操作,使数据恢复到它原先的状态。备忘录模式中包含备忘录这个类,这个类中有记录对象变化的字段state,需要备忘录的对象中包含创建备忘录的方法,也就是将状态保存到备忘录,还有从备忘录恢复状态的方法。备忘录模式中有管理员模式,用来存储备忘录,需要时从中获取备忘录进行恢复。

结构型

适配器模式

适配器模式就是实现需要调用的目标接口,接着通过继承或者引用的方式传入被适配对象,在接口方法中调用被适配对象的=业务代码

代理模式

真实调用对象和代理对象继承或者实现同个接口,将真实调用对象传入代理对象

装饰者模式

装饰者模式可以理解为被装饰者添加功能,在装饰对象中引用被装饰者,在被装饰者的基础上添加新功能。
代理模式和装饰者模式在功能上类似,都可以为引用对象添加功能。但是代理模式中代理类和被代理类实现同样的接口或者继承同个父类,返回的对象是一致的,而装饰者不需要继承同样的接口或者父类,可以返回一个新的类别。

桥接模式

桥接模式适用于多维度的场景,将一个维度的接口通过组合的方式传入另一个维度的抽象类,实现了不同维度的组合,避免了子类爆炸。如果多维度下不进行桥接模式,多维度就需要不断地继承,这样会造成子类的2次方爆炸。

外观模式

随着系统的模块越来越多,客户端的对系统的调用会增加难度。通过外观模式,将系统的全部模块绑定在一起,客户端只需要访问外观类即可。

享元对象模式

在一些场景下,我们有时需要创建大量的相同或相似对象,这可是一笔不小的开销。我们利用享元模式,尽量将相同的能共享的对象进行共享,同时支持非享元对象,即每个对象的不相同之处插入享元对象。

组合对象模式

在编程中,我们有时会处理叶子对象和树枝对象的问题。我们可以使用一个接口来表示这两种对象的共同方法,然后叶子对象和树枝对象分别实现特有的。它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性

    原文作者:ReycoChou
    原文地址: https://blog.csdn.net/weixin_40288381/article/details/97102403
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞