不变模式
模式定义
对象创建后,即不允许改变其内部状态。
模式结构与说明
不变模式不需要类图来描述。
不变模式分为两者形式:
- 弱不变模式:当前类的实例的状态是不会变化的,但是其子类的实例状态则可能变化
- 强不变模式:不但当前类的实例状态不会变化,子类实例的状态也不会变化
不变模式的优点:
- 允许多个Client共享一个对象
- 允许安全性浅拷贝
- 允许避免并发访问时的同步开销
经典应用
Java基础类型中的不变模式
Java的字符串和所有数字类型,都实现了不变模式,不提供任何操作来修改对象的内部状态:
一些“貌似”修改对状态的方法,实质上是返回了一个新的对象,例如String.trim()、BigDecimal.add():
1 2 3 4 5 6 |
public BigDecimal add(BigDecimal augend) { ... return (fst.signum == snd.signum) ? new BigDecimal(sum, INFLATED, rscale, 0) : new BigDecimal(sum, compactValFor(sum), rscale, 0); } |
C++语言级别的不变模式支持
在C++中,可以使用const关键字强制施加不变性约束:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class Immutable { private: int field; public: Immutable( int f ) : field( f ) { } void op() { } //声明为常方法,即不会改变对象的任何内部状态 void constOp() const { op(); //无法通过编译,常方法不得调用非常方法 this->field = 1; //无法通过编译,常方法不得对字段进行写操作 Immutable::staticField = 1; //静态字段的修改则不在限制 } }; |
模式演变
- 与享元模式联用:由于不变模式的对象的内部状态不会改变,因而它可以被安全的享元
Leave a Reply