Java设计模式篇(一)--不变模式

说设计模式,如果只是讲理论,估计很多人都会理解不透彻,今天我们结合JDK的源码设计,一块来说下设计模式中的不变模式.

1.什么是不变模式?

在并发程序中,为了保证临界区资源使用时不受其他线程干扰,使用锁控制可能是必不可少的,而同步锁控制会使系统的性能有所下降,为了尽可能提高并行程序的性能,我们可以使用一种不可改变的对象,依靠对象的不可变性,从而实现去锁操作,可以确保在多线程高并发情况下可以保持临界区资源的一致性,这就是不变模式.

说白了,不变模式,就是在对象创建完成后,不能再改变(我突然想起了小时候拉钩说的话),它的核心思想就是,一个对象一旦被创建,则它的内部状态就不允许再改变,基于这些特性,我们可以确定,不变模式对多线程是友好的,不需要进行同步锁控制.

2.不变模式的使用场景

根据不变模式的定义,我们可以大概猜出不变模式的应用场景:

①当对象创建后,不允许其他外部环境修改其内部状态和数据

②对象可以共享,即在多线程高并发情况下,可以被频繁访问.

不变模式在JDK中的应用很广泛,我们常用的String类,以及基本数据类型的包装类,如Integer,Boolean等等,都是使用不变模式实现的.那不变模式有哪些特征呢?

3.不变模式的实现特征

①类被定义为final,即该类不存在子类,也就防止了子类重载后修改父类的方法.[如public final class String]

②将所有的属性设置为private final,确保一次设置后不会再被修改

③去掉属性的setter方法以及所有可以修改对象属性的方法

④有一个可以创建完整对象的构造函数.

以上4点,我们使用String类来说明不变模式的实现.

4.源码展示

在JDK中,不变模式的应用很广泛,我们使用String类来说明,其他类如包装类的源码类似,大家可以自行研究.

类被定义为final,即该类不存在子类,也就防止了子类重载后修改父类的方法.

在String类中,我们看下它的定义.


 很明显,String类被定义为了不可变类,有不清楚final的,大家可以去看Java基础.

②将所有的不可变属性设置为private final,确保一次设置后不会再被修改



 

 
我们可以看到,在Boolean和String类中,不可变的属性都被用private final修饰,保证属性设置为私有,且只被设置一次.

③去掉属性的setter方法以及所有可以修改对象属性的方法



 ④有一个可以创建完整对象的构造函数.


从以上可以看出,基本数据类型的包装类都是用不变模式实现的.所以,想学习不变模式,那就看基本包装类吧.

5.不变模式与只读属性的区别
不变模式和只读属性是有区别的.只读属性只能保证对象属性不能被外界环境修改,但是对象的自身状态却可能自行修改.而不变模式是更强的一种做法,直接让对象的状态都不可变了,这样就保证了对象创建完成后,其内部状态和数据保持绝对的稳定.

猜你喜欢

转载自zhaodengfeng1989.iteye.com/blog/2413025