设计模式8-Flyweight

本文最后更新于:2 years ago

享元模式

  享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于 结构型模式 ,它提供了减少对象数量从而改善应用所需的对象结构的方式。

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

如果想了解享元模式的具体的介绍,菜鸟教程介绍得比较详细↓
菜鸟教程-享元模式

结构图


优缺点

优点: 大大减少对象的创建,降低系统的内存,使效率提高。

缺点: 提高了系统的复杂度,需要分离出外部状态和内部状态,而且外部状态具有固有化的性质,不应该随着内部状态的变化而变化,否则会造成系统的混乱。

使用场景

1、系统有大量相似对象。
2、需要缓冲池的场景。

实现代码

享元模式比较简单,就是重复利用对象,是一种”池”的思想。

这里我就直接介绍一下java中的享元模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
String s4 = new String("abc");

/**
* 在栈中new出来的String对象,如果发现字符串在常量池中存在,那么就指向这个字符串
*/

System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
System.out.println(s3 == s4); // false
System.out.println(s3.intern() == s1); // true intern()去拿常量池中的字符串
System.out.println(s3.intern() == s4.intern()); // true
}

输出结果

1
2
3
4
5
true
false
false
true
true

解释一下为什么
在Java中,字符串都放在一个常量池中,s1与s2,其实指向的就是同一个对象,所以为true;
而s3和s4都是在堆栈中new出来的String对象,那么s3和s4的地址肯定是不一样的,所以s1!=s3,s3!=s4;
intern() 方法返回字符串对象的规范化表示形式
intern()作用就是去拿常量池中的字符串。如果new出来的是常量的话,那么在堆栈中就指向这个字符串,所以s3.intern()==s1,s3.intern()==s4.intern()

单个享元模式是很好理解的,难度大一点的享元模式是和上一章学的Composite(组合模式)结合的。


图中,A、B…为叶子节点,ABBAAB可以理解为子节点,但是他们共同组成了享元模式。
这就是享元模式+组合模式的应用,这里就不多扩展了,主要还是了解享元模式。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!