java23种设计模式
设计模式是面向对象设计原则的实际运用。是设计经验的总结,具有一定的普遍性,可反复使用。
创建者模式(用于创建对象):单例、原型、工厂方法、抽象工厂、建造者。
结构型模式(将类或对象按布局组成更大的结构):代理、适配器、桥接、装饰、外观、享元、组合。
行为型模式(描述类或对象间怎样相互协作完成单个对象无法单独完成的任务,以及怎么分配职责):模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器。
设计原则
目的:提高代码的维护性、复用性、可扩展、灵活性,提高开发效率、节约开发成本和维护成本。
开闭原则:对拓展开放、对修改关闭。(接口和抽象)
里氏替换原则:子类继承父类时,除了添加新的方法完成新增功能外,尽量不要重写父类的方法。
单例模式singleton
定义:保证一个类只有一个实例,并且提供一个全局访问点。
场景:重量级的对象,不需要多个实例,如线程池,数据库连接池。
1.懒汉模式
定义:延迟加载,只有真正使用的使用,才开始加载。
1)线程问题
2)double check 加锁优化
3)指令防重排
2.饿汉模式
定义:类加载的初始化阶段就完成了实例的初始化。本质上是借助于jvm类的加载机制,保证了实例的唯一性。
类加载过程:
1.加载二进制数据到内存中,生成对应的class数据结构。
2.连接:
a.验证
b.准备(给类的静态成员变量赋默认值)
c.初始化:给类的静态变量赋初值
只有在真正使用对应的类时,才会触发初始类 如(当前类是启动类、直接进行new 操作、访问静态属性、访问静态方法、用反射访问类、初始化一个类的字类等)
3.静态内部类
1)本质上是利用类的加载机制来保证线程安全。
2)只有在实际使用的时候,才会触发类的初始化,所以也是懒加载的一种形式。
4.反射爆破
单例模式可以通过反射暴力破解,从而使单例变成多例。
饿汉模式和静态内部类模式,可以在构造器加判断抛出异常防止反射爆破,懒汉模式不行。
简单工厂模式
根据传入的参数创造出对应的实例。
工厂方法
定义一个创建对象的接口,让子类决定实例化哪个类。
抽象工厂
创建相关或依赖对象的家族,无需明确指定具体类