# design-training
**Repository Path**: dingjunjun_codeSpace/design-training
## Basic Information
- **Project Name**: design-training
- **Description**: java设计模式收集。结合本人项目经验,收集企业开发中常用的设计模式。
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2025-07-28
- **Last Updated**: 2025-07-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 一、设计模式原则
`开闭原则(OCP,Open-Close) `: 对扩展开放,对修改关闭。从而减少维护带来新的风险。
`依赖倒置原则(DIP,Dependence Inversion)`: 高层不应该依赖低层,而应该依赖其抽象。 从而更利于代码结构的升级扩展。
`单一职责原则(SRP,Simple Responsibility)`: 一个类只干一件事。 从而便于理解,提高代码可读性。
`接口隔离原则(ISP,Interface Segregation)`: 一个接口只干一件事。从而实现功能解耦,高聚合,低耦合。
`迪米特法则(LOD,Law of Demeter)`: 不该知道的不要知道。只和朋友交流,不和陌生人说话。从而减少代码臃肿。
`里氏替换原则(LSP,Liskov Substitution)`: 子类重写方法功能发生改变,不应该影响父类方法的含义。从而防止继承泛滥。
`合成复用原则(CARP, Composite/Aggregate Reuse)`: 尽量使用组合实现代码复用,而不使用继承。从而降低代码耦合。
# 二、设计模式详情
## a_简单工厂设计模式
就是对一类产品的对象创建进行集中管理和处理的一种设计模式。
`典型应用`:Spring使用工厂模式通过BeanFactory、ApplicationContext创建bean对象
## b_抽象工厂设计模式
## c_工厂方法设计模式
类似b_抽象工厂设计模式
## d_策略者模式
通过使用策略者设计模式与工厂设计模式进行配合,可以很好的达到开闭原则。也可以很容易的优化程序中出现的if/else问题。未来的新的业务的需求可以很快的进行高效的扩展。
`典型应用`:
1. 系统中有很多的实现类,而它们的区别仅仅在于行为不同。
2. 一个系统需要动态地在几种算法中选择一种。
## e_模板方法设计模式
1. 面向抽象类的模板方法
2. 面向接口的模板方法
3. 用户属性包装优雅写法
`典型应用`: Spring中jdbcTemplate、hibernateTemplate等以Template结尾的对数据库操作的类。
## f_责任链设计模式
### (1) 责任链应用场景
操作需要经过一系列的校验,通过校验后才执行某些操作。

2. 工作流。企业中通常会制定很多工作流程,一级一级的去处理任务。
### (2) 责任链特点
1. 降低耦合性。分离请求和处理。
2. 无需关注责任链是如何处理的,以及处理的细节。
3. 可以按需控制请求处理的顺序,实现流程编排。
4. 扩展性高。可以动态的新增或减少处理器,不需要改动核心流程代码
5. 代码复用。责任链抽离的处理器可被复用。
### (3) 责任链结合其他设计模式
1. 责任链模式+建造者模式
## g_单例设计模式
不允许外部直接创建对象,即不允许在外部类去new,所以使用private构造函数。
1. 饿汉模式
线程安全。
`缺点`:类加载的时候就把对象在内存空间初始化了,不管用不用都占着内存空间,浪费内存。
`典型应用`:Spring中的Bean默认都是单例的。
2. `破坏单例模式的方法`:1) 反射。 2) 序列化。 3) 克隆。 唯独枚举不会被这三种方法破坏
3. `反射破坏单例问题`:饿汉模式、懒汉模式、懒汉静态内部类模式、懒汉双重锁检查机制、cas机制、注册表的容器方式都会被反射破坏单例模式。 唯独注册表的枚举单例模式不会受到影响。
## h_代理设计模式
代理对象对原始逻辑进行增强。
1. `静态代理`:代理对象只能代理单一接口,如果换了业务,代理类就要重新创建。
2. `动态代理`:(JDK动态代理基于接口进行代理的,必须要有一个接口)代理对象能够代理全部接口,只需定义一个。
`典型应用`: Spring AOP功能的实现
## i_迭代器模式
很多语言都实现了。掌握其思想即可(思考为什么迭代器可以删除数据)。
## j_建造者模式
## k_观察者模式
ObserverPattern定义了对象之间的一种一对多依赖。让多个观察者同时监听。当发生变化时,它的所有的依赖者(观察者)都会收到。
观察者设计模式也称之为:发布订阅设计模式、事件监听、事件驱动编程、消息通知机制。
`典型应用`:
1. 场景一: 观察者主要用于在关联行为之间建立一套触发记住的场景,观察者模式在现实生活应用也是非常广泛,比如:下单通知、发短信,发消息,发微信,发邮件等等。
2. 场景二: 比如发布文章,我们需要对文章发日志,静态化,存储数据库,存储es,存储缓存等等。也可以使用观察者设计模式来进行开发和处理。
3. Spring事件驱动模型。
## l_原型链模式
问1:原型设计模式clone对象是否会进入构造函数?
答1:clone复制对象根本没有进入构造函数,说明clone不会走new方式来申请内存空间,而是直接在内存中进行复制,所以clone方式比new方式创建对象的速度和性能更快。
问2:原型设计模式clone会不会破坏单例设计模式?
答2:会。
## m_状态模式
状态模式(State Pattern)是⼀种⾏为型设计模式,它适⽤于⼀个对象在不同的状态下有不同的⾏为时,⽐如说电灯的开、关、闪烁是不停的状态,状态不同时,对应的⾏为也不同。
在没有状态模式的情况下,为了添加新的状态或修改现有的状态,往往需要修改已有的代码,这违背了开闭原则,⽽且如果对象的状态切换逻辑和各个状态的⾏为都在同⼀个类中实现,就可能导致该类的职责过重,不符合单⼀职责原则。
⽽状态模式将每个状态的⾏为封装在⼀个具体状态类中,使得每个状态类相对独⽴,并将对象在不同状态下的⾏为进⾏委托,从⽽使得对象的状态可以在运⾏时动态改变,每个状态的实现也不会影响其他状态。
缺点:状态模式将每个状态的实现都封装在⼀个类中,每个状态类的实现相对独⽴,使得添加新状态或修改现有状态变得更加容易,避免了使⽤⼤量的条件语句来控制对象的⾏为。但是如果状态过多,会导致类的数量增加,可能会使得代码结构复杂。