导图社区 Java设计模式
总体来说,设计模式分为三大类: 创建型模式:共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
编辑于2022-09-11 22:46:22 广东单例模式
1. 饿汉式
1. 构造私有
2. 静态成员实例化(构造私有无法创建实例对象)
3. 公共静态方法获取实例
2. 懒汉式
1. 构造私有
2. .声明静态成员变量
3. 提供公共静态方法获取实例
判断成员变量是否为null
3. 双检锁式
1. 构造私有
2. .声明静态成员变量
3. 提供公共静态方法获取实例
判断成员变量是否为null 再加锁 再判断
4. 静态内部类
1. 构造私有
2. .声明静态内部类
3. 提供公共静态方法获取静态内部内种实例
5. 枚举
1. 定义枚举类
2. 声明枚举项
枚举是单例模式中唯一一个能防止反射破坏单例模式(由JVM控制)
单例模式
1. 饿汉式
1. 构造私有
2. 静态成员实例化(构造私有无法创建实例对象)
3. 公共静态方法获取实例
2. 懒汉式
1. 构造私有
2. .声明静态成员变量
3. 提供公共静态方法获取实例
判断成员变量是否为null
3. 双检锁式
1. 构造私有
2. .声明静态成员变量
3. 提供公共静态方法获取实例
判断成员变量是否为null 再加锁 再判断
4. 静态内部类
1. 构造私有
2. .声明静态内部类
3. 提供公共静态方法获取静态内部内种实例
5. 枚举
1. 定义枚举类
2. 声明枚举项
枚举是单例模式中唯一一个能防止反射破坏单例模式(由JVM控制)
UML类图
1.类的表示方式
一个类的完整组成
1. 属性
1. 可见性
+ public
# protected
- private
2. 名称
3. 类型
4. 默认值
2. 方法
1. 可见性
2. 名称(参数列表)
3. 返回类型
2.类与类之间的关联关系表示
1. 关联关系
单向关联 : 一个类被另外一个类关联
多向关联 : 类与类之间相互关联
自关联 : 一个类被自身所关联 (LinkedList)
2. 聚合关系 : 聚合关系是整体和部分之间的关系 在类图中 使用带空心的菱形实线表示,菱形指向整体 (学校不在了,老师能独立存在 )
3. 组合关系 : 比聚合关系更加强烈 两个类组成一个更加整体的类 在类图中 使用实心的菱形实线表示 菱形指向整体 (头不在了 嘴就不存在了)
4. 依赖关系 : 一个类中需要使用另外一个类 在类图中使用虚线箭头表示 , 箭头指向被依赖的类
5. 继承关系 : 继承关系是对象之间耦合最大的一种关系 在类图中用实线空心三角箭头表示箭头指向父类,
6. 实现关系 : 实现类与接口之间的关系 在类图中使用带三角箭头的虚线表示
工厂模式
主题
浮动主题
构建者模式
1. 角色
a. 抽象构建者类 Builder : 规定了复杂对象的那些对象要被创建,并不设计具体的部件对象创建
b. 具体建造者类 ConcreateBuilder : 实现Builder接口 ,完成复杂产品各个部件的具体创建方法 。 在构造过程完成后,提供产品的实例
c. 产品类 : Producte : 要创建的复杂对象
d. 指挥者类 : Director : 调用具体的建造者来完成复杂对象的创建
2. 主题
3. 主题
设计模式7大原则
单一职责
概述
一个类只负责一个职责,如果类A 负责 职责1 以及 职责2 当 职责1需要变动而改变 类A 时 可能导致 职责2出错
细节
1. 降低类的复杂度,一个类只负责一项职责
2. 提高类的可读性,可维护性
3. 降低变更带来的风险
4. 通常情况下,我们应该经量遵守单一职责原则,只有当逻辑特别简单的时候, 代码量非常少的情况下 才能违背单一职责
接口隔离
概述
一个类不应该依赖它不需要的接口 即一个类对另外一个类的依赖,应该建立在最少接口的基础上
依赖倒置
概述
高层模块不应该依赖低层模块,两者都应该依赖其抽象. 抽象不应该依赖细节,细节应该依赖抽象,依赖倒置的中心思想即面向接口编程
细节
1. 底层模块尽量都要有抽象类或接口,或者两者都有
2. 声明一个类变量应该尽量是接口或者抽象类型
3. 继承时遵守里氏替换原则
里氏替换
概述
所有用到父类的地方都能使用子类替换
细节
当一个类被其他类所继承的时候,则当此类需要修改的时候,就需要考虑是否会对其他类造成影响
开闭原则
概述
对扩展开发,对修改关闭
细节
当软件需要变化时,经量通过扩展软件的实体的行为来控制变化,而不是改变已有的代码
迪米特法则
概述
一个类对自己依赖的类知道的信息越少越好,即对于被依赖的类,不管逻辑多么复杂,都应该封装在其内部
细节
迪米特法则的核心是降低类之间的耦合
合成复用原则
概述
尽量使用 合成/聚合的方式 而不是使用继承
细节
1. 找出应用中可能需要变化之处,把他们独立出来,不要和不需要变化的代码混在一起
2. 针对接口编程,而不是实现
构建者模式
1. 角色
a. 抽象构建者类 Builder : 规定了复杂对象的那些对象要被创建,并不设计具体的部件对象创建
b. 具体建造者类 ConcreateBuilder : 实现Builder接口 ,完成复杂产品各个部件的具体创建方法 。 在构造过程完成后,提供产品的实例
c. 产品类 : Producte : 要创建的复杂对象
d. 指挥者类 : Director : 调用具体的建造者来完成复杂对象的创建
2. 主题
3. 主题
单例模式
1. 饿汉式
1. 构造私有
2. 静态成员实例化(构造私有无法创建实例对象)
3. 公共静态方法获取实例
2. 懒汉式
1. 构造私有
2. .声明静态成员变量
3. 提供公共静态方法获取实例
判断成员变量是否为null
3. 双检锁式
1. 构造私有
2. .声明静态成员变量
3. 提供公共静态方法获取实例
判断成员变量是否为null 再加锁 再判断
4. 静态内部类
1. 构造私有
2. .声明静态内部类
3. 提供公共静态方法获取静态内部内种实例
5. 枚举
1. 定义枚举类
2. 声明枚举项
枚举是单例模式中唯一一个能防止反射破坏单例模式(由JVM控制)
工厂模式
1. 简单工厂模式
主要角色
1. 抽象产品
2. 具体产品
3. 具体工厂
优缺点
1. 优点:封装了对象的创建过程 将对象的创建和业务分开,但产生了工厂对象和具体对象使用者之间的耦合
2. 缺点 : 增加新的对象时,需要修改工厂类的代码,违背了开闭原则
2. 工厂方法模式
主要角色
1. 抽象工厂
2. 具体工厂
3. 抽象产品
4. 具体产品
优缺点
1. 优点
a. 使用者无需关注对象的创建过程,只需获取工厂对象即可
b. 当新增一个对象时,只需要新增对应的工厂对象和具体对象, 无需对原对象进行修改,满足开闭原则
2. 缺点
a. 每新增一个对象,就要新增对应的工厂对象与具体对象,增加了系统的复制度
3. 抽象工厂模式
设计模式分类
创建型模式 5种
将对象的创建与使用隔离(解耦)
1. 单例模式
2. 原型模式
3. 工厂模式
4. 抽象工厂模式
5. 建造者模式
结构型模式 7种
将类或对象按某种布局组成更大的结构
1. 代理模式
2. 适配器模式
3. 桥接模式
4. 装饰模式
5. 外观模式
6. 享元模式
7. 组合模式
行为型模式 11种
类或对象之间怎样相互协作共同完成单个对象无法完成的任务,已经怎么分配职责
1. 模板方法模式
2. 策略模式
3. 命令模式
4. 职责链模式
5. 状态模式
6. 观察者模式
7. 中介者模式
8. 迭代器模式
9. 访问者模式
10. 备忘录模式
11. 解释器模式
UML类图
1.类的表示方式
一个类的完整组成
1. 属性
1. 可见性
+ public
# protected
- private
2. 名称
3. 类型
4. 默认值
2. 方法
1. 可见性
2. 名称(参数列表)
3. 返回类型
2.类与类之间的关联关系表示
1. 关联关系
单向关联 : 一个类被另外一个类关联
多向关联 : 类与类之间相互关联
自关联 : 一个类被自身所关联 (LinkedList)
2. 聚合关系 : 聚合关系是整体和部分之间的关系 在类图中 使用带空心的菱形实线表示,菱形指向整体 (学校不在了,老师能独立存在 )
3. 组合关系 : 比聚合关系更加强烈 两个类组成一个更加整体的类 在类图中 使用实心的菱形实线表示 菱形指向整体 (头不在了 嘴就不存在了)
4. 依赖关系 : 一个类中需要使用另外一个类 在类图中使用虚线箭头表示 , 箭头指向被依赖的类
5. 继承关系 : 继承关系是对象之间耦合最大的一种关系 在类图中用实线空心三角箭头表示箭头指向父类,
6. 实现关系 : 实现类与接口之间的关系 在类图中使用带三角箭头的虚线表示
工厂模式
1. 简单工厂模式
主要角色
1. 抽象产品
2. 具体产品
3. 具体工厂
优缺点
1. 优点:封装了对象的创建过程 将对象的创建和业务分开,但产生了工厂对象和具体对象使用者之间的耦合
2. 缺点 : 增加新的对象时,需要修改工厂类的代码,违背了开闭原则
2. 工厂方法模式
主要角色
1. 抽象工厂
2. 具体工厂
3. 抽象产品
4. 具体产品
优缺点
1. 优点
a. 使用者无需关注对象的创建过程,只需获取工厂对象即可
b. 当新增一个对象时,只需要新增对应的工厂对象和具体对象, 无需对原对象进行修改,满足开闭原则
2. 缺点
a. 每新增一个对象,就要新增对应的工厂对象与具体对象,增加了系统的复制度
3. 抽象工厂模式
设计模式分类
创建型模式 5种
将对象的创建与使用隔离(解耦)
1. 单例模式
2. 原型模式
浅克隆 : 创建一个新的对象,属性跟被克隆对象一致,引用类型属性指向同一个内存地址
深克隆 : 创建一个新的对象,基本类型跟被克隆对象一致,引用类型指向了一个新的内存地址
3. 工厂模式
4. 抽象工厂模式
5. 建造者模式
结构型模式 7种
将类或对象按某种布局组成更大的结构
1. 代理模式
a. 静态代理
b. 动态代理
(1) JDK动态代理
(2) CGLB代理
2. 适配器模式
a. 主要角色
(1) 目标接口 : 当前系统所期待的接口或者抽象类
(2) 适配者类 : 它是被访问的和适配的现存组件库中的组件接口
(3) 适配器类 : 它是一个转换器,通过继承或者引用适配器对象,把适配器接口转换为目标接口,让客户按目标接口的格式访问适配者
b. 实现方式
类适配器类
定义一个适配器类 实现目标接口,同时又继承现有组件库中已经存在的组件
对象适配器类
定义一个适配器类 实现目标接口,同时声明现有组件的抽象类或接口变量
c. JDK源码中的使用案例
字节流 转换 为 字符流
3. 装饰模式(与静态代理非常相似)
a. 主要角色
1. 抽象构建角色 : 定义一个抽象接口以规范准备接受附加责任的对象
2. 具体构建角色 : 实现抽象构建,通过装饰角色为其添加一些职责
3. 抽象装饰角色 : 继承或实现抽象构建,并包含具体构件的实例,可以通过子类扩展具体构件
4. 具体装饰角色 : 实现抽象装饰的相关方法, 并给具体构件对象添加附加的责任
b. 特征
装饰者类 实现了 接口或继承 并声明对应的 变量
c. 与代理模式比较
1. 相同点
(1) 都要实现目标接口
(2) 都需要声明目标对象
(3) 都可以在不修改目标类的前提下增强目标方法
2. 不同点
(1) 目的不同 : 装饰者模式是为了增强目标对象,而代理模式则是为了保护和隐藏目标对
(2) 获取目标对象实例的地方不同 : 装饰者是由外界传递进来,可用通过构造方法传递,而静态代理则是在代理类内部创建,以此来隐藏目标对象
4. 桥接模式
a. 主要角色
(1) 抽象化角色 : 定义抽象类,并包含一个对实现化对象的引用
(2) 扩展抽象化角色 : 是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用是现货角色中的业务方法
(3) 实现化角色 : 定义实现化角色的接口,供扩展抽象化角色调用
(4) 具体实现化角色 : 给出实现化角色的具体实现
5. 外观模式
a. 定义
外观模式又称为整体模式.适用于把一组相似的对象当做一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设置模式属于结构性模式,它创建对象组的树形结构
6. 组合模式
a. 主要角色
1. 抽象根节点 : 定义系统个层次对象的共有方法和属性,可以预先定义一下默认行为和属性
2. 树枝节点 : 定义树枝节点的行为,存储子节点,组合树枝节点和叶子节点形成一个树形结构
3. 叶子节点 : 叶子节点对象,其下再无分支,是系统层次遍历的最小单位
b. 适用于 树目录
c. 分类
(1) 透明模式 : 所有构建类都有相同的的接口 ,但是 虽然在编译时期不会出错,但在运行时可能会出现异常 调用了属于非叶子结点的方法 而叶子结点本不能调用的方法
(2) 安全组合模式 : 针对不同的接口,拥有不同的方法 但是不能继承同一接口了
7. 享元模式
行为型模式 11种
类或对象之间怎样相互协作共同完成单个对象无法完成的任务,已经怎么分配职责
1. 模板方法模式
2. 策略模式
3. 命令模式
4. 职责链模式
5. 状态模式
6. 观察者模式
7. 中介者模式
8. 迭代器模式
9. 访问者模式
10. 备忘录模式
11. 解释器模式
UML类图
1.类的表示方式
一个类的完整组成
1. 属性
1. 可见性
+ public
# protected
- private
2. 名称
3. 类型
4. 默认值
2. 方法
1. 可见性
2. 名称(参数列表)
3. 返回类型
2.类与类之间的关联关系表示
1. 关联关系
单向关联 : 一个类被另外一个类关联
多向关联 : 类与类之间相互关联
自关联 : 一个类被自身所关联 (LinkedList)
2. 聚合关系 : 聚合关系是整体和部分之间的关系 在类图中 使用带空心的菱形实线表示,菱形指向整体 (学校不在了,老师能独立存在 )
3. 组合关系 : 比聚合关系更加强烈 两个类组成一个更加整体的类 在类图中 使用实心的菱形实线表示 菱形指向整体 (头不在了 嘴就不存在了)
4. 依赖关系 : 一个类中需要使用另外一个类 在类图中使用虚线箭头表示 , 箭头指向被依赖的类
5. 继承关系 : 继承关系是对象之间耦合最大的一种关系 在类图中用实线空心三角箭头表示箭头指向父类,
6. 实现关系 : 实现类与接口之间的关系 在类图中使用带三角箭头的虚线表示
设计模式分类
创建型模式 5种
将对象的创建与使用隔离(解耦)
1. 单例模式
2. 原型模式
浅克隆 : 创建一个新的对象,属性跟被克隆对象一致,引用类型属性指向同一个内存地址
深克隆 : 创建一个新的对象,基本类型跟被克隆对象一致,引用类型指向了一个新的内存地址
3. 工厂模式
4. 抽象工厂模式
5. 建造者模式
结构型模式 7种
将类或对象按某种布局组成更大的结构
1. 代理模式
a. 静态代理
b. 动态代理
(1) JDK动态代理
(2) CGLB代理
2. 适配器模式
a. 主要角色
(1) 目标接口 : 当前系统所期待的接口或者抽象类
(2) 适配者类 : 它是被访问的和适配的现存组件库中的组件接口
(3) 适配器类 : 它是一个转换器,通过继承或者引用适配器对象,把适配器接口转换为目标接口,让客户按目标接口的格式访问适配者
b. 实现方式
类适配器类
定义一个适配器类 实现目标接口,同时又继承现有组件库中已经存在的组件
对象适配器类
定义一个适配器类 实现目标接口,同时声明现有组件的抽象类或接口变量
c. JDK源码中的使用案例
字节流 转换 为 字符流
3. 装饰模式(与静态代理非常相似)
a. 主要角色
1. 抽象构建角色 : 定义一个抽象接口以规范准备接受附加责任的对象
2. 具体构建角色 : 实现抽象构建,通过装饰角色为其添加一些职责
3. 抽象装饰角色 : 继承或实现抽象构建,并包含具体构件的实例,可以通过子类扩展具体构件
4. 具体装饰角色 : 实现抽象装饰的相关方法, 并给具体构件对象添加附加的责任
b. 特征
装饰者类 实现了 接口或继承 并声明对应的 变量
c. 与代理模式比较
1. 相同点
(1) 都要实现目标接口
(2) 都需要声明目标对象
(3) 都可以在不修改目标类的前提下增强目标方法
2. 不同点
(1) 目的不同 : 装饰者模式是为了增强目标对象,而代理模式则是为了保护和隐藏目标对
(2) 获取目标对象实例的地方不同 : 装饰者是由外界传递进来,可用通过构造方法传递,而静态代理则是在代理类内部创建,以此来隐藏目标对象
4. 桥接模式
a. 主要角色
(1) 抽象化角色 : 定义抽象类,并包含一个对实现化对象的引用
(2) 扩展抽象化角色 : 是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用是现货角色中的业务方法
(3) 实现化角色 : 定义实现化角色的接口,供扩展抽象化角色调用
(4) 具体实现化角色 : 给出实现化角色的具体实现
5. 外观模式
a. 定义
外观模式又称为整体模式.适用于把一组相似的对象当做一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设置模式属于结构性模式,它创建对象组的树形结构
6. 组合模式
a. 主要角色
1. 抽象根节点 : 定义系统个层次对象的共有方法和属性,可以预先定义一下默认行为和属性
2. 树枝节点 : 定义树枝节点的行为,存储子节点,组合树枝节点和叶子节点形成一个树形结构
3. 叶子节点 : 叶子节点对象,其下再无分支,是系统层次遍历的最小单位
b. 适用于 树目录
c. 分类
(1) 透明模式 : 所有构建类都有相同的的接口 ,但是 虽然在编译时期不会出错,但在运行时可能会出现异常 调用了属于非叶子结点的方法 而叶子结点本不能调用的方法
(2) 安全组合模式 : 针对不同的接口,拥有不同的方法 但是不能继承同一接口了
7. 享元模式
在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
行为型模式 11种
类或对象之间怎样相互协作共同完成单个对象无法完成的任务,已经怎么分配职责
1. 模板方法模式
a. 定义: 方法的执行顺序已经固定了,在父类中使用finally修饰
b. 主要角色 :
(1) 抽象类:负责给出一个算法的轮廓和骨架. 它由一个模板方法和若干个基本方法组成
1||| 模板方法: 定义了方法的执行顺序,方法声明使用finally
2||| 基本方法: 是实现算法各个步骤的方法,是模板方法的组成部分.基本方法又可以分为三种
i. 抽象方法 ;由具体子类实现
ii. 一个具体的方法由一个抽象类或具体类声明并实现,其子类可以进行覆盖
iii. 钩子方法 : 在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写等待空方法两种.一般钩子方法用于判断的逻辑方法,改类方法名一般为 isXxx,返回值类型为 boolean 类型
3||| 具体子类 : 实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的组成步骤
c. 优缺点
优点 :
提高了代码的复用性
将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中
缺点 :
对于每个不同的实现,都需要定义一个子类 增加类的个数
d. 适用场景 : 拥有相同方法执行顺序的类(算法固定),大部分方法是一样的,只是其中个别方法需要变动
2. 策略模式
a. 主要角色
1. 抽象策略类 : 这是一个抽象角色,通常由一个接口或抽象类实现.提供具体策略类所需的接口
2. 具体策略类 : 实现了抽象策略定义的接口,提供具体的算法实现或行为
3. 环境类 : 持有一个策略类的引用,最终给客户端调用
b. 优缺点
优点
由于策略类都实现了同一个接口,策略类之间可以替换
易于扩展
避免使用多重if else
缺点
使用者需要知道所有的策略类,并自行决定使用哪一个策略类
策略模式容易产生很多策略类,通过享元模式可以减少数量
3. 命令模式
a. 定义 : 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分隔开.
b. 主要角色
抽象命令类角色 : 定义命令的接口,声明执行的方法
具体命令角色 : 具体的命令,实现命令接口;通常会持有接受者,并调用接受者的功能来完成命令要执行的操作
实现者/接受者角色 : 接受者,真正执行命令的UI小.任何类都可能成为接受者,只要他能够实现命令要求实现的相应功能
调用者/请求者角色 : 要求命令对象执行请求,通常会持有命令对象.可以持有很多的命令对象.这个是客户端真正触发命令并要求命令执行相应操作的地方
4. 职责链模式
5. 状态模式
6. 观察者模式
定义 : 又称发布-订阅模式 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己
角色
抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象
具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发送改变时,给所有注册过的观察者发送通知
抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己
具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态
7. 中介者模式
8. 迭代器模式
9. 访问者模式
10. 备忘录模式
11. 解释器模式
单例模式
1. 饿汉式
1. 构造私有
2. 静态成员实例化(构造私有无法创建实例对象)
3. 公共静态方法获取实例
2. 懒汉式
1. 构造私有
2. .声明静态成员变量
3. 提供公共静态方法获取实例
判断成员变量是否为null
3. 双检锁式
1. 构造私有
2. .声明静态成员变量
3. 提供公共静态方法获取实例
判断成员变量是否为null 再加锁 再判断
4. 静态内部类
1. 构造私有
2. .声明静态内部类
3. 提供公共静态方法获取静态内部内种实例
5. 枚举
1. 定义枚举类
2. 声明枚举项
枚举是单例模式中唯一一个能防止反射破坏单例模式(由JVM控制)
工厂模式
1. 简单工厂模式
主要角色
1. 抽象产品
2. 具体产品
3. 具体工厂
优缺点
1. 优点:封装了对象的创建过程 将对象的创建和业务分开,但产生了工厂对象和具体对象使用者之间的耦合
2. 缺点 : 增加新的对象时,需要修改工厂类的代码,违背了开闭原则
2. 工厂方法模式
主要角色
1. 抽象工厂
2. 具体工厂
3. 抽象产品
4. 具体产品
优缺点
1. 优点
a. 使用者无需关注对象的创建过程,只需获取工厂对象即可
b. 当新增一个对象时,只需要新增对应的工厂对象和具体对象, 无需对原对象进行修改,满足开闭原则
2. 缺点
a. 每新增一个对象,就要新增对应的工厂对象与具体对象,增加了系统的复制度
3. 抽象工厂模式
构建者模式
1. 角色
a. 抽象构建者类 Builder : 规定了复杂对象的那些对象要被创建,并不设计具体的部件对象创建
b. 具体建造者类 ConcreateBuilder : 实现Builder接口 ,完成复杂产品各个部件的具体创建方法 。 在构造过程完成后,提供产品的实例
c. 产品类 : Producte : 要创建的复杂对象
d. 指挥者类 : Director : 调用具体的建造者来完成复杂对象的创建
2. 主题
3. 主题
单例模式
1. 饿汉式
1. 构造私有
2. 静态成员实例化(构造私有无法创建实例对象)
3. 公共静态方法获取实例
2. 懒汉式
1. 构造私有
2. .声明静态成员变量
3. 提供公共静态方法获取实例
判断成员变量是否为null
3. 双检锁式
1. 构造私有
2. .声明静态成员变量
3. 提供公共静态方法获取实例
判断成员变量是否为null 再加锁 再判断
4. 静态内部类
1. 构造私有
2. .声明静态内部类
3. 提供公共静态方法获取静态内部内种实例
5. 枚举
1. 定义枚举类
2. 声明枚举项
枚举是单例模式中唯一一个能防止反射破坏单例模式(由JVM控制)
UML类图
1.类的表示方式
一个类的完整组成
1. 属性
1. 可见性
+ public
# protected
- private
2. 名称
3. 类型
4. 默认值
2. 方法
1. 可见性
2. 名称(参数列表)
3. 返回类型
2.类与类之间的关联关系表示
1. 关联关系
单向关联 : 一个类被另外一个类关联
多向关联 : 类与类之间相互关联
自关联 : 一个类被自身所关联 (LinkedList)
2. 聚合关系 : 聚合关系是整体和部分之间的关系 在类图中 使用带空心的菱形实线表示,菱形指向整体 (学校不在了,老师能独立存在 )
3. 组合关系 : 比聚合关系更加强烈 两个类组成一个更加整体的类 在类图中 使用实心的菱形实线表示 菱形指向整体 (头不在了 嘴就不存在了)
4. 依赖关系 : 一个类中需要使用另外一个类 在类图中使用虚线箭头表示 , 箭头指向被依赖的类
5. 继承关系 : 继承关系是对象之间耦合最大的一种关系 在类图中用实线空心三角箭头表示箭头指向父类,
6. 实现关系 : 实现类与接口之间的关系 在类图中使用带三角箭头的虚线表示
工厂模式
主题
浮动主题
设计模式分类
创建型模式 5种
将对象的创建与使用隔离(解耦)
1. 单例模式
2. 原型模式
3. 工厂模式
4. 抽象工厂模式
5. 建造者模式
结构型模式 7种
将类或对象按某种布局组成更大的结构
1. 代理模式
2. 适配器模式
3. 桥接模式
4. 装饰模式
5. 外观模式
6. 享元模式
7. 组合模式
行为型模式 11种
类或对象之间怎样相互协作共同完成单个对象无法完成的任务,已经怎么分配职责
1. 模板方法模式
2. 策略模式
3. 命令模式
4. 职责链模式
5. 状态模式
6. 观察者模式
7. 中介者模式
8. 迭代器模式
9. 访问者模式
10. 备忘录模式
11. 解释器模式
UML类图
1.类的表示方式
一个类的完整组成
1. 属性
1. 可见性
+ public
# protected
- private
2. 名称
3. 类型
4. 默认值
2. 方法
1. 可见性
2. 名称(参数列表)
3. 返回类型
2.类与类之间的关联关系表示
1. 关联关系
单向关联 : 一个类被另外一个类关联
多向关联 : 类与类之间相互关联
自关联 : 一个类被自身所关联 (LinkedList)
2. 聚合关系 : 聚合关系是整体和部分之间的关系 在类图中 使用带空心的菱形实线表示,菱形指向整体 (学校不在了,老师能独立存在 )
3. 组合关系 : 比聚合关系更加强烈 两个类组成一个更加整体的类 在类图中 使用实心的菱形实线表示 菱形指向整体 (头不在了 嘴就不存在了)
4. 依赖关系 : 一个类中需要使用另外一个类 在类图中使用虚线箭头表示 , 箭头指向被依赖的类
5. 继承关系 : 继承关系是对象之间耦合最大的一种关系 在类图中用实线空心三角箭头表示箭头指向父类,
6. 实现关系 : 实现类与接口之间的关系 在类图中使用带三角箭头的虚线表示
设计模式分类
创建型模式 5种
将对象的创建与使用隔离(解耦)
1. 单例模式
2. 原型模式
浅克隆 : 创建一个新的对象,属性跟被克隆对象一致,引用类型属性指向同一个内存地址
深克隆 : 创建一个新的对象,基本类型跟被克隆对象一致,引用类型指向了一个新的内存地址
3. 工厂模式
4. 抽象工厂模式
5. 建造者模式
结构型模式 7种
将类或对象按某种布局组成更大的结构
1. 代理模式
a. 静态代理
b. 动态代理
(1) JDK动态代理
(2) CGLB代理
2. 适配器模式
a. 主要角色
(1) 目标接口 : 当前系统所期待的接口或者抽象类
(2) 适配者类 : 它是被访问的和适配的现存组件库中的组件接口
(3) 适配器类 : 它是一个转换器,通过继承或者引用适配器对象,把适配器接口转换为目标接口,让客户按目标接口的格式访问适配者
b. 实现方式
类适配器类
定义一个适配器类 实现目标接口,同时又继承现有组件库中已经存在的组件
对象适配器类
定义一个适配器类 实现目标接口,同时声明现有组件的抽象类或接口变量
c. JDK源码中的使用案例
字节流 转换 为 字符流
3. 装饰模式(与静态代理非常相似)
a. 主要角色
1. 抽象构建角色 : 定义一个抽象接口以规范准备接受附加责任的对象
2. 具体构建角色 : 实现抽象构建,通过装饰角色为其添加一些职责
3. 抽象装饰角色 : 继承或实现抽象构建,并包含具体构件的实例,可以通过子类扩展具体构件
4. 具体装饰角色 : 实现抽象装饰的相关方法, 并给具体构件对象添加附加的责任
b. 特征
装饰者类 实现了 接口或继承 并声明对应的 变量
c. 与代理模式比较
1. 相同点
(1) 都要实现目标接口
(2) 都需要声明目标对象
(3) 都可以在不修改目标类的前提下增强目标方法
2. 不同点
(1) 目的不同 : 装饰者模式是为了增强目标对象,而代理模式则是为了保护和隐藏目标对
(2) 获取目标对象实例的地方不同 : 装饰者是由外界传递进来,可用通过构造方法传递,而静态代理则是在代理类内部创建,以此来隐藏目标对象
4. 桥接模式
a. 主要角色
(1) 抽象化角色 : 定义抽象类,并包含一个对实现化对象的引用
(2) 扩展抽象化角色 : 是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用是现货角色中的业务方法
(3) 实现化角色 : 定义实现化角色的接口,供扩展抽象化角色调用
(4) 具体实现化角色 : 给出实现化角色的具体实现
5. 外观模式
a. 定义
外观模式又称为整体模式.适用于把一组相似的对象当做一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设置模式属于结构性模式,它创建对象组的树形结构
6. 组合模式
a. 主要角色
1. 抽象根节点 : 定义系统个层次对象的共有方法和属性,可以预先定义一下默认行为和属性
2. 树枝节点 : 定义树枝节点的行为,存储子节点,组合树枝节点和叶子节点形成一个树形结构
3. 叶子节点 : 叶子节点对象,其下再无分支,是系统层次遍历的最小单位
b. 适用于 树目录
c. 分类
(1) 透明模式 : 所有构建类都有相同的的接口 ,但是 虽然在编译时期不会出错,但在运行时可能会出现异常 调用了属于非叶子结点的方法 而叶子结点本不能调用的方法
(2) 安全组合模式 : 针对不同的接口,拥有不同的方法 但是不能继承同一接口了
7. 享元模式
行为型模式 11种
类或对象之间怎样相互协作共同完成单个对象无法完成的任务,已经怎么分配职责
1. 模板方法模式
2. 策略模式
3. 命令模式
4. 职责链模式
5. 状态模式
6. 观察者模式
7. 中介者模式
8. 迭代器模式
9. 访问者模式
10. 备忘录模式
11. 解释器模式
设计模式分类
创建型模式 5种
将对象的创建与使用隔离(解耦)
1. 单例模式
2. 原型模式
浅克隆 : 创建一个新的对象,属性跟被克隆对象一致,引用类型属性指向同一个内存地址
深克隆 : 创建一个新的对象,基本类型跟被克隆对象一致,引用类型指向了一个新的内存地址
3. 工厂模式
4. 抽象工厂模式
5. 建造者模式
结构型模式 7种
将类或对象按某种布局组成更大的结构
1. 代理模式
a. 静态代理
b. 动态代理
(1) JDK动态代理
(2) CGLB代理
2. 适配器模式
a. 主要角色
(1) 目标接口 : 当前系统所期待的接口或者抽象类
(2) 适配者类 : 它是被访问的和适配的现存组件库中的组件接口
(3) 适配器类 : 它是一个转换器,通过继承或者引用适配器对象,把适配器接口转换为目标接口,让客户按目标接口的格式访问适配者
b. 实现方式
类适配器类
定义一个适配器类 实现目标接口,同时又继承现有组件库中已经存在的组件
对象适配器类
定义一个适配器类 实现目标接口,同时声明现有组件的抽象类或接口变量
c. JDK源码中的使用案例
字节流 转换 为 字符流
3. 装饰模式(与静态代理非常相似)
a. 主要角色
1. 抽象构建角色 : 定义一个抽象接口以规范准备接受附加责任的对象
2. 具体构建角色 : 实现抽象构建,通过装饰角色为其添加一些职责
3. 抽象装饰角色 : 继承或实现抽象构建,并包含具体构件的实例,可以通过子类扩展具体构件
4. 具体装饰角色 : 实现抽象装饰的相关方法, 并给具体构件对象添加附加的责任
b. 特征
装饰者类 实现了 接口或继承 并声明对应的 变量
c. 与代理模式比较
1. 相同点
(1) 都要实现目标接口
(2) 都需要声明目标对象
(3) 都可以在不修改目标类的前提下增强目标方法
2. 不同点
(1) 目的不同 : 装饰者模式是为了增强目标对象,而代理模式则是为了保护和隐藏目标对
(2) 获取目标对象实例的地方不同 : 装饰者是由外界传递进来,可用通过构造方法传递,而静态代理则是在代理类内部创建,以此来隐藏目标对象
4. 桥接模式
a. 主要角色
(1) 抽象化角色 : 定义抽象类,并包含一个对实现化对象的引用
(2) 扩展抽象化角色 : 是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用是现货角色中的业务方法
(3) 实现化角色 : 定义实现化角色的接口,供扩展抽象化角色调用
(4) 具体实现化角色 : 给出实现化角色的具体实现
5. 外观模式
a. 定义
外观模式又称为整体模式.适用于把一组相似的对象当做一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设置模式属于结构性模式,它创建对象组的树形结构
6. 组合模式
a. 主要角色
1. 抽象根节点 : 定义系统个层次对象的共有方法和属性,可以预先定义一下默认行为和属性
2. 树枝节点 : 定义树枝节点的行为,存储子节点,组合树枝节点和叶子节点形成一个树形结构
3. 叶子节点 : 叶子节点对象,其下再无分支,是系统层次遍历的最小单位
b. 适用于 树目录
c. 分类
(1) 透明模式 : 所有构建类都有相同的的接口 ,但是 虽然在编译时期不会出错,但在运行时可能会出现异常 调用了属于非叶子结点的方法 而叶子结点本不能调用的方法
(2) 安全组合模式 : 针对不同的接口,拥有不同的方法 但是不能继承同一接口了
7. 享元模式
在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
行为型模式 11种
类或对象之间怎样相互协作共同完成单个对象无法完成的任务,已经怎么分配职责
1. 模板方法模式
a. 定义: 方法的执行顺序已经固定了,在父类中使用finally修饰
b. 主要角色 :
(1) 抽象类:负责给出一个算法的轮廓和骨架. 它由一个模板方法和若干个基本方法组成
1||| 模板方法: 定义了方法的执行顺序,方法声明使用finally
2||| 基本方法: 是实现算法各个步骤的方法,是模板方法的组成部分.基本方法又可以分为三种
i. 抽象方法 ;由具体子类实现
ii. 一个具体的方法由一个抽象类或具体类声明并实现,其子类可以进行覆盖
iii. 钩子方法 : 在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写等待空方法两种.一般钩子方法用于判断的逻辑方法,改类方法名一般为 isXxx,返回值类型为 boolean 类型
3||| 具体子类 : 实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的组成步骤
c. 优缺点
优点 :
提高了代码的复用性
将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中
缺点 :
对于每个不同的实现,都需要定义一个子类 增加类的个数
d. 适用场景 : 拥有相同方法执行顺序的类(算法固定),大部分方法是一样的,只是其中个别方法需要变动
2. 策略模式
a. 主要角色
1. 抽象策略类 : 这是一个抽象角色,通常由一个接口或抽象类实现.提供具体策略类所需的接口
2. 具体策略类 : 实现了抽象策略定义的接口,提供具体的算法实现或行为
3. 环境类 : 持有一个策略类的引用,最终给客户端调用
b. 优缺点
优点
由于策略类都实现了同一个接口,策略类之间可以替换
易于扩展
避免使用多重if else
缺点
使用者需要知道所有的策略类,并自行决定使用哪一个策略类
策略模式容易产生很多策略类,通过享元模式可以减少数量
3. 命令模式
a. 定义 : 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分隔开.
b. 主要角色
抽象命令类角色 : 定义命令的接口,声明执行的方法
具体命令角色 : 具体的命令,实现命令接口;通常会持有接受者,并调用接受者的功能来完成命令要执行的操作
实现者/接受者角色 : 接受者,真正执行命令的UI小.任何类都可能成为接受者,只要他能够实现命令要求实现的相应功能
调用者/请求者角色 : 要求命令对象执行请求,通常会持有命令对象.可以持有很多的命令对象.这个是客户端真正触发命令并要求命令执行相应操作的地方
4. 职责链模式
5. 状态模式
6. 观察者模式
定义 : 又称发布-订阅模式 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己
角色
抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象
具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发送改变时,给所有注册过的观察者发送通知
抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己
具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态
7. 中介者模式
8. 迭代器模式
9. 访问者模式
10. 备忘录模式
11. 解释器模式
单例模式
1. 饿汉式
1. 构造私有
2. 静态成员实例化(构造私有无法创建实例对象)
3. 公共静态方法获取实例
2. 懒汉式
1. 构造私有
2. .声明静态成员变量
3. 提供公共静态方法获取实例
判断成员变量是否为null
3. 双检锁式
1. 构造私有
2. .声明静态成员变量
3. 提供公共静态方法获取实例
判断成员变量是否为null 再加锁 再判断
4. 静态内部类
1. 构造私有
2. .声明静态内部类
3. 提供公共静态方法获取静态内部内种实例
5. 枚举
1. 定义枚举类
2. 声明枚举项
枚举是单例模式中唯一一个能防止反射破坏单例模式(由JVM控制)
工厂模式
1. 简单工厂模式
主要角色
1. 抽象产品
2. 具体产品
3. 具体工厂
优缺点
1. 优点:封装了对象的创建过程 将对象的创建和业务分开,但产生了工厂对象和具体对象使用者之间的耦合
2. 缺点 : 增加新的对象时,需要修改工厂类的代码,违背了开闭原则
2. 工厂方法模式
主要角色
1. 抽象工厂
2. 具体工厂
3. 抽象产品
4. 具体产品
优缺点
1. 优点
a. 使用者无需关注对象的创建过程,只需获取工厂对象即可
b. 当新增一个对象时,只需要新增对应的工厂对象和具体对象, 无需对原对象进行修改,满足开闭原则
2. 缺点
a. 每新增一个对象,就要新增对应的工厂对象与具体对象,增加了系统的复制度
3. 抽象工厂模式
构建者模式
1. 角色
a. 抽象构建者类 Builder : 规定了复杂对象的那些对象要被创建,并不设计具体的部件对象创建
b. 具体建造者类 ConcreateBuilder : 实现Builder接口 ,完成复杂产品各个部件的具体创建方法 。 在构造过程完成后,提供产品的实例
c. 产品类 : Producte : 要创建的复杂对象
d. 指挥者类 : Director : 调用具体的建造者来完成复杂对象的创建
UML类图
1.类的表示方式
一个类的完整组成
1. 属性
1. 可见性
+ public
# protected
- private
2. 名称
3. 类型
4. 默认值
2. 方法
1. 可见性
2. 名称(参数列表)
3. 返回类型
2.类与类之间的关联关系表示
1. 关联关系
单向关联 : 一个类被另外一个类关联

多向关联 : 类与类之间相互关联

自关联 : 一个类被自身所关联 (LinkedList)

2. 聚合关系 : 聚合关系是整体和部分之间的关系 在类图中 使用带空心的菱形实线表示,菱形指向整体 (学校不在了,老师能独立存在 )

3. 组合关系 : 比聚合关系更加强烈 两个类组成一个更加整体的类 在类图中 使用实心的菱形实线表示 菱形指向整体 (头不在了 嘴就不存在了)

4. 依赖关系 : 一个类中需要使用另外一个类 在类图中使用虚线箭头表示 , 箭头指向被依赖的类

5. 继承关系 : 继承关系是对象之间耦合最大的一种关系 在类图中用实线空心三角箭头表示箭头指向父类,

6. 实现关系 : 实现类与接口之间的关系 在类图中使用带三角箭头的虚线表示

设计模式7大原则
单一职责
概述
一个类只负责一个职责,如果类A 负责 职责1 以及 职责2 当 职责1需要变动而改变 类A 时 可能导致 职责2出错
细节
1. 降低类的复杂度,一个类只负责一项职责
2. 提高类的可读性,可维护性
3. 降低变更带来的风险
4. 通常情况下,我们应该经量遵守单一职责原则,只有当逻辑特别简单的时候, 代码量非常少的情况下 才能违背单一职责
接口隔离
概述
一个类不应该依赖它不需要的接口 即一个类对另外一个类的依赖,应该建立在最少接口的基础上
依赖倒置
概述
高层模块不应该依赖低层模块,两者都应该依赖其抽象. 抽象不应该依赖细节,细节应该依赖抽象,依赖倒置的中心思想即面向接口编程
细节
1. 底层模块尽量都要有抽象类或接口,或者两者都有
2. 声明一个类变量应该尽量是接口或者抽象类型
3. 继承时遵守里氏替换原则
里氏替换
概述
所有用到父类的地方都能使用子类替换
细节
当一个类被其他类所继承的时候,则当此类需要修改的时候,就需要考虑是否会对其他类造成影响
开闭原则
概述
对扩展开发,对修改关闭
细节
当软件需要变化时,经量通过扩展软件的实体的行为来控制变化,而不是改变已有的代码
迪米特法则
概述
一个类对自己依赖的类知道的信息越少越好,即对于被依赖的类,不管逻辑多么复杂,都应该封装在其内部
细节
迪米特法则的核心是降低类之间的耦合
合成复用原则
概述
尽量使用 合成/聚合的方式 而不是使用继承
细节
1. 找出应用中可能需要变化之处,把他们独立出来,不要和不需要变化的代码混在一起
2. 针对接口编程,而不是实现