首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计形式之不变设计模式

2013-10-22 
设计模式之不变设计模式不变设计模式(immutable pattern)1 定义这些对象共享相同对象的引用,为此,在对象构

设计模式之不变设计模式
不变设计模式(immutable pattern)
1 定义

这些对象共享相同对象的引用,为此,在对象构造好之后,不允许改变共享对象的内容

2 例子在jdk中String被设计为不可变类,一旦生成一个String对象,它的所有属性就不会被变,任何方法要么返回这个对象本身的原
始状态,要么抛弃原来的字符串返回一个新字符串,而绝对不会返回被修改了的字符串对象.
StringBuffer是可变类
3 如何设计不可变类不变类,即类中的方法和属性不能被外界修改,包括其子类
1.类本身声明为final,可以保证它本身的状态不会被子类扩展方法所改变,即没有子类。
2.类的所有成员变量都是final的,保证它在构造后不会被重新赋值.而且类所有属性是private的,只提供getter访问.
3.类的能传入的参数是Immutable的,且返回的属性也是不可变的.
如果方法返回的属性是基本类型,则在类中将该属性声明为final即可。
如果是引用类型,该属性的final只能保证引用类型的引用地址不可变,无法保证外界对该引用类型内容的修改,所以一般返回该引用类型的一份拷贝。
注意:在将可变类封装到不变类的时候要特别小心.因为你传入的引用在外面是可以被修改的.所以即使你不变类本身不能去改变属性,但属性有一个外部引用.可以在外面修改。
4 优缺点1)不变类优点:
多个线程共享一个不变类的实例时,这个实例的状态不会发生改变.事实上它没有地方让你去改变.所以多线程共享一个不变类的实例时,不需要进行临界区保护(即同步)。

2)不变类缺点:不灵活

5 应用5.1设计一个缓存

例子:设计一个单例,属性HashMap已被赋值,外部只能使用属性HashMap的值,不能对其进行修改,所以只返回HashMap中的值,不返回该HashMap的引用地址。

public ExamImmutableQueue<E> append(ExamImmutableQueue<E> queue){      ExamImmutableQueue<E> temp=queue;ExamImmutableQueue<E> result=this;    if(!queue.isEmpty()){        for(int i=0;i<queue.size;i++){     q.add(temp.peek()); temp=temp.dequeue();  }//end for   }//end if      return result;} //end append()

参考文献:

Immutability in C# Part Four: An Immutable Queue 

Immutability in C# Part Two: A Simple Immutable Stack

Making an immutable queue with guaranteed constant time operations

热点排行