关于Java设计模式
视频地址:https://www.bilibili.com/video/BV1G4411c7N4?p=1
一、七大设计原则
1.单一职责原则
2.接口隔离原则
3.依赖倒转原则:中心思想-面向接口编程
4.里氏替换原则:中心思想-子类尽量不要重写父类的方法
5.开闭原则:中心思想-对扩展开放(提供方),对修改关闭(使用方),抽象构建框架,实现扩展细节
6.迪米特法则:中心思想:最少知道原则,陌生的类最好不要以局部变量的形式出现在类的内部
7.合成复用原则:尽量使用合成/聚合的方式,而不是使用继承
二、UML类图
1.类图的六大关系:依赖、泛化、实现、关联、聚合、组合
三、设计模式
分三种类型:创建型模式、结构型模式、行为型模式
单例模式:只能存在一个对象实例
(1)饿汉式(静态常量):可用,可能造成内存浪费,没有懒加载效果,线程安全
(2)饿汉式(静态代码块):同上
(3)懒汉式:线程不安全,不推荐使用
(4)懒汉式(同步方法):线程安全,效率低,不推荐使用
(5)懒汉式(同步代码块):线程不安全,不能使用
(6)双重检查:线程安全,延迟加载,效率高,推荐使用
(7)静态内部类:懒加载,线程安全,推荐使用
(8)枚举:线程安全,防止反序列化,推荐使用
使用场景
(1)频繁的创建和销毁的对象
(2)创建对象耗时过多或者耗费过多资源(重量级对象)
(3)经常用到的对象、工具类对象、频繁访问数据库或文件的对象(数据源、session工厂)
2.简单工厂模式(静态工厂模式)
simpleFactory可能多个就演变成了工厂方法模式
3.工厂方法模式:将对象的实例化推迟到子类
OrderPizza可能多个就演变成了抽象工厂模式
4.抽象工厂模式:两层 AbsFactory(抽象工厂)和具体实现工厂子类
工厂模式小结
- 工厂模式的意义
将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。 - 三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式)
- 设计模式的依赖抽象原则
创建对象实例时,不要直接 new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。
不要让类继承具体类,而是继承抽象类或者是实现interface(接口)
不要覆盖基类中已经实现的方法。
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象
1.Spring中原型bean的创建,就是原型模式的应用 scope=“prototype”
2.浅拷贝:
(1)基本数据类型:值传递
(2)引用类型:复制引用地址
实现方式:重写clone()方法
3.深拷贝:
(1)基本数据类型:值传递
(2)引用类型:复制新对象
实现方式
(1)重写clone()方法
(2)通过对象序列化(推荐使用)
建造者模式:将产品和产品建造的过程解耦,JDK应用:StringBuilder
(1)Product(产品角色)
(2)Builder(抽象建造者)
(3)ConcreteBuilder(具体建造者)
(4)Director(指挥者)
建造者模式和抽象工厂模式区别
抽象工厂模式:只关心什么产品由什么工厂生产,不关心产品构建过程
建造者模式:按照指定的蓝图构建产品,通过零件组装产生新的产品
适配器模式
主要分三类:类适配器模式、对象适配器模式(常用)、接口适配器模式(适用于一个接口不想使用其所有方法的情况)
将一个类的接口转换成另一个类的接口,让原本不兼容的类可以兼容
应用:SpringMVC的HandlerAdapter
桥接模式:基于类的最小设计原则,抽象和实现分离
应用:JDBC源码 Driver接口
应用场景
要求:正确识别出系统中两个独立变化的维度(抽象和实现)
装饰者模式:动态的将新功能附加到对象上,在对象功能扩展方面,它比继承更有弹性,装饰者和被装饰者实现同一个接口
咖啡(被装饰者)-调料(装饰者)
应用:Java IO FilterInputStream就是一个装饰者
装饰者类Decorator把装饰者和被装饰者进行组合
组合模式:又叫部分整体模式
Department:叶子节点
College:非叶子节点
University:非叶子节点
应用:java集合类-HashMap就使用了组合模式
Map(接口)->AbstractMap(抽象类)->HashMap
Map和AbstractMap类似Component
HashMap:类似于上图的College、University
HashMap中的静态内部类Node类似于Department
外观模式:也叫过程模式
外观模式就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用
应用:Mybatis中的Configuration去创建MetaObject对象使用到外观模式
享元模式:也叫蝇量模式,能够解决重复对象的内存浪费问题,经典的应用场景就是池技术,String常量池、数据库连接池、缓冲池等都是享元模式的应用
"享"就表示共享,"元"就表示对象
应用:Integer中的享元模式 Integer.valueOf()
low:-128 high:127
代理模式:分三种静态代理、动态代理(JDK代理、接口代理)和Cglib代理(可以在内存动态的创建对象,而不需要实现接口)
静态代理模式
动态代理*
java动态代理机制中有两个重要的类和接口InvocationHandler(接口)和Proxy(类)
这一个类Proxy和接口InvocationHandler是我们实现动态代理的核心;
Cglib代理:又叫子类代理
MethodInterceptor:Cglib包下面的类
模板方法模式
模板方法模式的钩子方法
应用:Spring IOC容器初始化时用到了模板方法模式
命令模式
Invoker(调用者角色)和Receiver(接收者角色)通过ConcreteCommand(将接收者对象与一个动作绑定,调用接收者相应的操作)解耦
Command:命令角色,接口或抽象类
应用:Spring框架的JDBCTemplate就使用到了命令模式
访问者模式
双分派
迭代器模式
应用:JDK的ArrayList就使用了迭代器模式,ArrayList底层是数组,LinkedList
底层是链表
观察者模式
应用:JDK的Observable类就使用了观察者模式
中介者模式
备忘录模式
解释器模式
应用:Spring框架中SpelExpressionParser就用到了解释器模式
状态模式
应用
策略模式
Duck:算法使用者
FlyBehavior:算法提供者
应用:JDK的Arrays的Comparator就使用了策略模式
责任链模式
应用:SpringMvc的HandlerExecutionChain类就使用到了职责链模式
设计模式应用
聚合支付设计:https://www.cnblogs.com/lyc94620/p/13055116.html
https://cloud.tencent.com/developer/article/1457962
比较实用的设计模式:策略模式、工厂模式、适配器模式
https://www.cnblogs.com/zhya/p/9957819.html