一、单例模式
单例模式属于创建型模式,解决某个类频繁的创建与销毁。该模式保证了其对象在JVM
中只有一个实例对象存在。必须保证私有化构造函数,只能有一个实例对象存在。
优点:
- 减少
new
关键字的使用,降低系统内存的使用频率,同时减轻GC
工作 - 避免了资源的多重使用
使用场景:比如Spring我们在创建bean的时候
二、工厂模式
不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂。
在各种BeanFactory以及ApplicationContext创建中都有用到。数据库连接DriverManager是一个工厂类
特点:
提供一种创建对象的最佳方式,在创建对象时不提供对外暴露创建逻辑,并且通过一个共同的接口来指向新创建的对象。
定义一个创建对象的接口,让子类来决定实例化哪一个具体的工厂类,延迟到子类去执行
主要解决选择接口的问题。
扩展性高,只增加相应工厂类即可,知道名称即可创建对象,屏蔽具体的实现,调用者只关心接口
增加需求时,需要增加具体类与工厂实现,导致类个数成倍增加,增加系统复杂度
只有需要生成复杂类对象时才需要使用工厂模式,且简单工厂模式不属于23种设计模式
三、建造者模式(Builder)
- 在需要生成复杂内部结构时使用,即将多个简单的对象一步一步构建称为一个复杂对象。
- 将一个复杂对象的构建过程与它的实现表示分离,使得同样的构建过程可以创建不同的表示,属于创建型模式
如: builder.setAge(20)
.setName("张三")
.setAddress("北京市")
.setSex("男")
.setBorn("厦门")
.create();
案例:
JDK的StringBuilder,它提供append()方法,给我们开放构建步骤,最后调用toString()方法就可以获得一个构建好的完整的字符串。
Mybatis中,比如SqlSessionFactoryBuilder通过调用builder()方法获得的是一个SqlSessionFactory类。
四、适配器模式
适配器模式:它是使原本接口不兼容的对象能够相互合作。
如springBoot当中的日志输出。
该模式的主要优点如下:
客户端通过适配器可以透明地调用目标接口。
复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
在很多业务场景中符合开闭原则。
五、代理模式
解决问题:
对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问,直接访问会给使用者或者系统结构带来很多麻烦
租客 —— 中介 —— 房东
代理模式的应用场景、业务系统的非功能性需求开发
代理模式最常见的一个应用场景就是,在业务系统中开发一些非功能性的需求,比如:监控、统计、鉴权、限流、事务、幂等、日志等的。我们将这些附加功能与业务模式解耦,放到代理类中统一处理,让程序员只需要关注业务方面的开发。
如果你熟悉 Java 语言和 Spring 开发框架,这部分工作都是可以在 Spring AOP 切面中完成的
六、观察者模式
特点
类和类之间的关系,对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式的应用场景:
在以下情况就可以考虑使用观察者模式:
一个对象的改变会导致一个或多个对象发生改变,而并不知道具体有多少对象将会发生改变,也不知道这些对象是谁。
当一个抽象模型有两个方面,其中的一个方面依赖于另一个方面时,可将这两者封装在独立的对象中以使他们可以各自独立地改变和复用。
需要在系统中创建一个触发链,使得事件拥有跨域通知(跨越两种观察者的类型)。
观察者模式在MVC中的应用
MVC(Modew-View-Controller)架构中也应用了观察者模式,其中模型(Model)可以对应观察者模式中的观察目标,而视图(View)对应于观察者,控制器(Controller)就是中介者模式的应用