设计模式个人总结。
不断更新;
其实在平常学习、做项目中,设计模式有意无意都能碰见;
在去年选了《UML》课程后,相当于采用了明确的方式对这些设计模式进行了重新认识;
本科其实也有这门课程,但是由于放在了靠后的学期,以及忙于实习、项目等其他事务,还有限于当时的水平,并没有充分认识到这门课的重要性;
后来逐渐意识到平常学习、做项目中,处处都能遇到,所以建议可以不用专门去学习,因为核心在于学的是设计模式的思想,在有了系统性的理论知识后,在平常积累即可;
这里列举积累的设计模式,大概介绍和以及应用场景:
常用的设计模式:
【1】单例模式:(当然也有许多派生的其他实现方式,目前已知的有8种)
懒汉式:
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
醉汉式:类加载时就初始化,浪费内存。
public class Singleton {
private static Singleton instance = new Singleton(); private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
典型代表:RocketMQ启动过程中,通过一个单例模式的 MQClientManager 获取 MQClientInstance 的实例 mQClientFactory,没有则自动创建新的实例;
【2】工厂模式:ConnectionFactory SessionFactory ....
【3】代理模式:
Spring AOP底层实现就是动态代理;
RPC框架中:stub桩的设计使用了动态代理;
【4】策略模式:一个接口提供多种不同的实现类
1)例如 List接口 ArrayList LinkedList 实现类;
2)spring的context;
3)其实lambda表达式的演化过程也用过策略模式:垃圾代码 --> 策略模式 --> 匿名内部类 --> Lambda表达式;
4)RocketMQ选择队列时,MessageQueueSelector#select 方法使用了策略模式(Strategy Pattern),来解决不同场景下需要使用不同的队列选择算法问题;
【5】包装模式:IO流 节点流外面套一层层的过滤流(包装流、处理流);
【6】命令模式:Struts <result >;
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于 行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调 用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的 对象,该对象执行命令。
如何解决:通过调用者调用接受者执行命令,顺序:调用者→命令→ 接受者。
关键代码:定义三个角色:1、received 真正的命令执行对象 2、 Command 3、invoker 使用命令对象的入口
应用实例:struts 1 中的 action 核心控制器 ActionServlet 只 有一个,相当于 Invoker,而模型层的类会随着不同的应用有不同 的模型类,相当于具体的 Command。
【7】适配器模式:
适配器模式是作为两个不兼容的接口之间的桥梁。
将一个类的接口转换成客户希望的另外一个接口。
如何解决:继承或依赖(推荐)。
关键代码:适配器继承或依赖已有的对象,实现想要的目标接口。
【8】外观模式:Facade Pattern(就叫外观模式,没有别的名字)
外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访 问系统的接口。
何时使用: 1、客户端不需要知道系统内部的复杂联系,整个系统只 需提供一个"接待员"即可。 2、定义系统的入口。
如何解决:客户端不与系统耦合,外观类与系统耦合。
关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、 依赖关系等处理好。
应用实例: 1、去医院看病,可能要去挂号、门诊、划价、取药,让 患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来 处理,就很方便。 2、JAVA 的三层开发模式(表现、业务、持久)
典型代表:RockectMQ 的 Producer 入口类DefaultMQProducer使用了外观模式。
【9】观察者模式:
常见:发布-主题-订阅;
【10】java8并行流:Fork / Join 框架与传统线程池的区别:采用了“工作窃取”模式;
【11】原型模式:
Spring 中 bean的创建就是原型模式;
beans.xml
<bean id="id01" class="com.atguigu.spring.bean.Monster" scope="prototype"/>【12】解释器模式:
Spring 框架中 SpelExpressionParser 就使用到解释器模式;
【13】模板方法设计模式:
AQS的设计;
【14】状态模式:state Pattern
RocketMQ的Producer里的DefaultMQProducerImpl#start() 方 法,使用一个成员变量 serviceState 来记录和管理自身的服务状态。
//
*:资源池模式 Future模式