Chinaunix首页 | 论坛 | 博客
  • 博客访问: 294597
  • 博文数量: 69
  • 博客积分: 2946
  • 博客等级: 少校
  • 技术积分: 800
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-09 04:15
文章分类

全部博文(69)

文章存档

2013年(6)

2012年(16)

2011年(18)

2010年(29)

分类: Java

2012-12-29 01:51:15

不变模式是一种比较普遍的一种设计模式,在我们所使用的一些类中就使用到了不变模式,比如Integer,String等。不变模式中,允许多个类对某个类进行访问,省略了同步化的消耗,使系统运行更加高效,提高了系统的健壮性(robustness)。类在实例化之后,其状态不允许被修改变化,当要修改状态时,需要创建一个新的对象来替换该类,实现状态的修改。给出下面例子:

1: String str = "China";

我们要修改str的状态,虚拟机会冲洗创建一个对象来代替“China”,让str重新指向这个对象:

1: String str = "I love " + str;

即str指向“I love China”新对象来实现状态的修改。

不变模式只涉及到一个类,在这个类实例从创建到消亡其状态不会发生变化,这个类被称作不变类。不变模式有两种模式,弱不变模式和强不变模式,下面分别对这两种模式给出说明。

◆弱不变模式

该类的实例不会发生变化,但是该类的子类的实例的状态可能会发生变化。

满足弱不变模式的条件:

1. 类中不能够存在改变类实例状态的方法,当该类的构造子完成类的实例化后,实例的状态不会被类中的方法改变;

2. 类中的属性必须为私有的,不能声明任何公有的属性。这样才能保证类在实例化之后,其状态不会被其它类修改其内部状态;

3. 同上,类中的状态尽量保持不变。当引用到外界的可变对象时,应该尽量设法限制对该可变对象的访问,防止在访问的时候修改可变对象状态。如果可以在类的内部初始化该可变对象,应该在类的内部进行初始化;如果必须从外部传入可变对象,应该在类初始化的时候就传入该可变对象的一份拷贝,而不是该可变对象。防止在传入该对象之后,实例之外有可变对象的其它引用,对可变对象进行修改。

◆强不变模式

强不变模式是在弱不变模式条件下的增强,不仅该类在初始化之后状态不能被改变,其子类的状态也不能被改变。强不变模式要求较弱不变模式高,所以强不变模式不仅要满足若不变模式的要求,还要满足下面要求之一:

1. 该类所有方法为final的,子类不能够覆盖父类中的方法,从而保证子类中的属性不能够被篡改;

2. 该类定义成final,即该类不能够有子类,其方法默认为final,因此不会被改变;

弱不变模式跟强不变模式相比存在某些明显的弱点:

  • 父类的对象为不变的,但是不能保证其子类为不变类,即其子类有可能为可变的;
  • 有可能通过子类的方法来修改父类不变对象的状态,从而改变了父类的初始状态;

不变模式的优点:

  • 由于类在初始化后其状态不能被改变,因此,由其运行导致的错误的几率就很小,维护起来也非常方便;
  • 减少了不同类访问过程中同步化的开销,其自动为线程安全的,从而不存在因状态不同步导致的线程安全问题。

不变模式的缺点:

由于不变类从初始化后就不能被修改,若要修改其状态,只能创建新的对象来替换其原来的对象。如果系统中这种操作太过频繁,会极大的降低系统性能,比如String类的“相加”,如果操作频繁,速度受影响较大。在这种情况就可以考虑使用替代方案,例如用StringBuilder和StringBuffer替换String来进行字符串的频繁操作。


Technorati Tags: ,,
阅读(1837) | 评论(0) | 转发(0) |
0

上一篇:设计模式-抽象工厂

下一篇:编程语言历史

给主人留下些什么吧!~~