# 设计模式学习 ## 大纲 **概述** **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)