设计模式之——组合模式(Composite)与享元模式(Flyweight)

本文介绍了组合模式(Composite)和享元模式(Flyweight)这两种结构型设计模式。组合模式用于表示对象的树状层次结构,常应用于文件系统和组织架构等场景。享元模式则通过共享技术减少对象创建,如Java中的String类型就使用了享元模式。文章通过代码示例和String的内存管理解释了这两种模式的应用。
摘要由CSDN通过智能技术生成

组合模式(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”后可以被ab引用,ab指向的是同一内容所以a == b is true

        c调用的是new String()是在堆里面创建了一个新对象,d也同理,所以a == c is false

        String中intern()方法是把这个堆中的所引用的常量找出来,而cd新建的栈中引用的都是“abc”,所以c.intern() == a is truec.intern() == d.intern() is true

结合Composite

        结合树状结构把享元模式利用到极致,具体实现建议参考Gof他们书中的实现举例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值