Java设计模式六大原则
单一功能原则、开放封闭原则、里氏替换原则、依赖倒置原则、接口分离原则、迪米特原则。
- 接口分离原则:其实就是接口设计的粒度大小要控制好,不要一个接口把所有具体的需求都包括了,应该要做一下划分,比如一个接口在拆成几个子接口。
- 依赖倒置:就是面向抽象编程,面向接口编程,而不是面向具体类编程。
- 迪米特原则:一个对象对其他对象的了解应该尽可能的少。因为一个对象对其他对象了解的越多,耦合就越大。
中介者模式
- 定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。通过使对象明确地相互引用来促进松散耦合,并允许独立地改变它们的交互。
- 类型:行为型
- 理解:将各个对象之间的交流封装在中介中,各个对象只和中介交流,从而使得维护变得简单。服务注册中心就体现了中介者模式思想。远程调用不是直接调物理主机而是首先和注册中心交流,此时注册中心相当于一个中介。
状态模式
- 定义:允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
- 模式结构:
上下文(context):状态运行的环境
抽象状态(State)角色:对状态类型的抽象
具体状态(Concrete State)角色:状态类型的实现 - 理解:经常有这种需求:当状态不同时,需要做出不同的行为。状态模式建议我们将每种状态对于的行为编写在对应的状态类中,而不是在代码中swich(state) case… akka的actor就体现了状态模式。每个actor是一个计算实体,有state、behavior、mailbox,其中behavior可以运行时随状态发生变化(即actor收到了某种signal)改变。
责任链模式
- 定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
- 理解:将handler组成一条链,request将沿着这条链传播直到某个handler能够处理这个request。这个模式好像并不常见,我所知道的只有Spring AOP使用了责任链模式,@Before->@After->@AfterRunning->AfterThrowing->@Around5个通知是通过通过指针不断的指向下一个来调用的。
单例模式
定义:一个类只有一个实例,并提供全局访问点。
理解:确保任何时刻JVM内至多有一个唯一的实例。
饿汉式-线程不安全
饿汉式-线程安全
保证线程安全,自然想到在getSingleTon方法前加synchronized关键字,但这有更好的实现。
里面那层判断是为了确保如果有多个线程进入了临界区,只有第一个线程能够创建这个对象,确保单例类只实例化一次。
另外还有静态方式、枚举方式,这两种懒汉式方式在类被加载的时候实例化单例对象,由JVM保证其单例性。
静态工厂/简单工厂
工厂模式定义: 提供创建对象的接口
工厂模式在Java随处可见。静态工厂就是用来创建产品的,产品是一个接口,有很多种产品,具体创建那种根据于传递的参数。Spring大量应用了工厂模式。Spring的BeanFactory核心就是传入一个Id获得一个该类的实例,当然不一定是创建,是否创建根据情况而定,BeanFactory工厂根据传入的参数,决定创建哪一类产品。