You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

243 lines
4.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 设计模式学习
## 大纲
**概述**
**1.如何评价代码的好坏**
**2.编程方法论**
**3.设计模式分类**
**4.六大设计原则**
**单一职责**
**里氏替换**
**依赖倒置**
**接口隔离**
**迪米特**
**开闭**
**名词解释**
**创建型**
**单例模式**
**工厂模式**
**抽象工厂模式**
**建造者模式**
**原型模式**
**结构型**
**代理模式**
**适配器模式**
**桥接模式**
**装饰器模式**
**组合模式**
**外观模式**
**享元模式**
**行为型**
**观察者模式**
**模板模式**
**策略模式**
**责任链模式**
**迭代器模式**
**状态模式**
**访问者模式**
**备忘录模式**
**命令模式**
**解释器模式**
**中介模式**
**5.UML类图**
## 2023/1/30学习
概述
1.**如何评价代码的好坏**
可扩展 可复用 可读 简洁 可测试 灵活 可维护
2.**编程方法论**
设计模式 + 设计原则 + 面向对象 + 编程规范 融汇贯通(先实现再考虑其它的)
3.**设计模式分类**
创建型 行为型 结构型
4.**六大设计原则**
**单一职责**
一个类只负责一个功能
**里氏替换**
方法参数定义为接口类型,不同的业务传入不同的实现类
**依赖倒置**
上层不应该依赖下层如controller 不应该依赖serviceImpl应该依赖其接口
**接口隔离**
不同的业务系统,在使用同一个业务对象时(微服务中),应当针对不同的系统设计出最小的依赖接口
**迪米特**
一个类依赖另一个类,应该依赖其接口
**开闭**
在扩展新的业务 不能改变原有的业务功能
**5.UML类图**
![1.UML类图](D:\01\md文档\myimage\1.UML类图.jpg)
**创建型**
**单例模式**
饿汉式没有做到懒加载JVM保证线程安全
懒汉式不加锁:懒加载,线程不安全
懒汉式加锁:懒加载,线程不安全,锁粒度太大
DCL懒加载线程不安全
静态内部类懒加载JVM保证线程安全
枚举(最佳)
反射机制破坏单例模式 ,解决方案 在构造方法中添加 instance 非空判断
序列化破坏单例模式添加readResolve方法
**工厂模式**
简单工厂 优点: 象的创建和业务逻辑层分开 缺点:新增产品时需要修改工厂类 不满足ocp
工厂方法 优点在简单工厂的基础上为每一个产品增加一个工厂满足ocp 缺点:类爆炸
抽象工厂 优点:将产品进行分类,为一类产品创建一个工厂(减少了工厂的创建)
**建造者模式**
当产品对象非常复杂时,建造者需要分步骤执行,可以类似工厂方法模式
**原型模式**
根据已有的对象复制出一个新的,有浅克隆和深克隆之分
深克隆可以有 Cloneable接口或者BeanUtils或者SerializationUtils实现
**结构型**
**代理模式**
静态代理 与动态代理
区别在于 生成代理类的时机 不同 静态代理在编译时 动态代理在运行时
JDK动态代理调用Proxy.newProxyInstance方法动态创建代理类字节码二进制流用的是ProxyGenarator技术
CGLIB动态代理调用的是Enhancer第三方ASM框架生成字节码
两者对比:
生成代理类的技术不同jdk使用ProxyGenarator生成cglib使用ASM框架生成
生成代理类的数量不同jdk只生成一个代理类cglig生成一个代理类和两个索引类(方法名和索引)
代理类的增强方式不同jdk是实现共同的接口cglib是继承
调用方式不用jdk是反射调用代理类方法 -> invok() ->反射调用目标类方法cglib是直接调用 代理类方法 -> intercept->直接调用目标类方法
**适配器模式**
**桥接模式**
指生产一个产品,分多步执行,每一步都有多种选择
**装饰器模式**
**组合模式**
**外观模式**
**享元模式**
**行为型**
**观察者模式**
**模板模式**
**策略模式**
**责任链模式**
**迭代器模式**
**状态模式**
**访问者模式**
**备忘录模式**
**命令模式**
**解释器模式**
**中介模式**
设计原则总结
![2. 六大设计原则](D:\01\md文档\myimage\2. 六大设计原则.jpg)
工厂模式总结
![3. 工厂模式](D:\01\md文档\myimage\3. 工厂模式.jpg)
建造者模式总结
![4.建造者模式](D:\01\md文档\myimage\4.建造者模式.jpg)
动态代理总结
![5.动态代理](D:\01\md文档\myimage\5.动态代理.jpg)