组合模式(Composite)
定义
组合(Composite Pattern)模式的定义: 它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式。
树状结构专用模式, 有时又叫作整体-部分(Part-Whole)模式
组合模式一般用来描述整体与部分的关系,它将对象组织到树形结构中,顶层的节点被称为根节点,根节点下面可以包含树枝节点和叶子节点,树枝节点下面又可以包含树枝节点和叶子节点,树形结构图如下。
应用场景
组合模式主要实现的就是树状结构,其应用场景主要有:
- 文件存放结构:
最常见的就是文件夹里有文件夹和文件这种树状结构。
- 组织架构:
在使用程序划分一个企业或组织的组织架构用树状组合模式再合适不过。
等等。。
组合模式的代码实现也比较简单,这里就不多演示了。
享元模式(Flyweight)
定义
享元(Flyweight)模式: 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。
特点
享元模式中相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力。
简单的说就是在程序中创建一个
FlyweightPool
享元池来存放元对象,让程序直接从池中取这些共享元对象来使用。
应用
在Gof他们的书中对享元模式的举例就很清晰:地址
String
Java中String
类型就是使用的享元模式。我们可以写个小程序来验证:
public static void main(String[] args) {
String a = "abc";
String b = "abc";
String c = new String("abc");
String d = new String("abc");
System.out.println("a == b is " + (a == b));
System.out.println("a == c is " + (a == c));
System.out.println("c == d is " + (c == d));
System.out.println("c.intern() == a is " + (c.intern() == a));
System.out.println("c.intern() == d.intern() is " + (c.intern() == d.intern()));
}
运行结果:
当String
在常量池里了创建了内容“abc”后可以被a
和b
引用,a
和b
指向的是同一内容所以a == b is true
;
c
调用的是new String()
是在堆里面创建了一个新对象,d
也同理,所以a == c is false
;
String中intern()
方法是把这个堆中的所引用的常量找出来,而c
和d
新建的栈中引用的都是“abc”,所以c.intern() == a is true
且c.intern() == d.intern() is true
。
结合Composite
结合树状结构把享元模式利用到极致,具体实现建议参考Gof他们书中的实现举例。