介绍
一个对象的状态在对象被创建之后就不再变化,这就是所谓的不变模式。
备注:这不属于“23种设计模式”。
模式的结构和实现
一般地讲,一个对象要么是可变对象,要么是不可变对象。一个可变对象的状态可以改变,而一个不可变对象的状态不可改变。
不变模式可增强对象的强壮型。不变模式允许多个对象共享某一对象,降低了对该对象进行并发访问时的同步化开销。如果需要修改一个不变对象的状态,那么就需要建立一个新的同类对象,并在创建时将这个新的状态存储在新对象里。
不变模式只涉及到一个类。一个类的内部状态被创建后,在整个生命周期间都不会发生变化时,这样的类称作不变类。这种使用不变类的做法叫做不变模式。
不变模式有两种形式:一种是弱不变模式,另一种是强不变模式。
弱不变模式
一个类的实例的状态是不可变化的:但是这个类的子类实例具有可能变化的状态。这样的类符合弱不变模式的定义。
强不变模式
一个类的实例的状态不会改变:同时它的子类的实例也具有不可变化的状态。这样的类符合强不变模式。那这样的类本身是final的或者这个类的所有方法应当是final。
“不变”和“只读”的区别
“不变”(Immutable)与“只读”(Read Only)是不同的。当一个变量是“只读”时,变量的值不能直接改变,但是可以在其他变量发生改变的时候发生改变。
比如,一个人的出生年月是“不变”属性。而一个人的年龄便是“只读”属性,但是不是“不变”属性。随着年龄的变化,一个人的年龄会随之变化,而人的出生年月则不会变化。这就是“不变”与“只读”的区别
Java中的不变模式
- String类。String类是一个强不变类。
- 封装类,如Integer、Float、Double、Byte、Long、Short、Boolean、Character(String类实际上是一个封装类,因为它封装了一个char数组)。这些封装类都是强不变类,这些类都是final的,在对象被从创建时它们蕴含的值(也就是它们的状态)就确定了。
优缺点
优点:易维护,线程安全
缺点:若需改变状态,需要创建一个新的同类对象。(参考String,享元模式)