三分钟理解“享元模式”——设计模式轻松掌握

享原模式的官方定义:

运用共享技术有效地支持大量细粒度的对象。

大白话讲:

一个类它可能生成好多对象,但这些对象根据属性值的不同一共分成N类,每种类型中属性值都是一样的。在这种情况下,如果创建好多对象,那么这些对象中很多属性值都是重复的,从而造成了大量的内存浪费。

而享元模式能够解决重复对象的内存浪费的问题。

享元模式使用一个工厂类,在工厂类中为每种类型创建一个对象,而且每种类型的对象只有一个。

当客户端需要某种类型的对象的时候,工厂将已创建好的对象给客户端。由于不创建新的对象了,所以节省了内存。

享元模式的类图:

客户端通过Factory.getFlyweight(key)来获取指定类型的Flyweight对象。

但这样有一个问题,有时候指定类型的对象中的某几个属性值可能不同,如果通过工厂获得的对象,由于他们都是统一个对象,因此他们的属性值都是完全一样的,这时就需要将属性值不一样的属性存在外部对象中,外部对象作为参数传递给Flyweight的函数,这些函数在执行过程中当遇到特殊属性的时候就会调用外部对象中的值。类图如下:

这里的User就是用于存储特殊值的外部类,在Flyweight类中需要用到属性特殊值的函数都需要将含有特殊属性值的外部类对象作为参数传递进来。

外部状态与内部状态:

在享元对象中,不会随环境变化而变化的共享属性称为享元的内部状态;

而随着环境变化而变化的,不可以共享的状态就是享元的外部状态。

何时使用?

享元模式可以避免大量非常相似的对象的开销。

在程序设计中,如果发现需要大量细粒度的类对象来表示数据,而且这些类除了几个参数不同以外,其他的属性都是相同的,这时候就可以使用享元模式。类中相同的属性可以通过工厂类来共享,这些属性就是享元类的内部状态;而那些会变化的属性放在新建的外部对象中,作为参数传递给享元类的函数。

享元模式的优点:

享元模式通过共享对象的方式,把所有对象的公共属性存放在同一个对象中,不同的属性存放在外部类中,从而起到了节省存储空间的作用。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

Java 面试题经典 77 问(含答案)!

1493
来自专栏开源优测

[快学Python3]XML解析处理 - Element Tree

概述 本文就是python xml解析进行讲解,在python中解析xml有很多种方法,本文通过实例来讲解如何使用ElementTree来解析xml。对于其他的...

3088
来自专栏大闲人柴毛毛

Java异常体系中的秘密

相信大家每天都在使用Java异常机制,也相信大家对try-catch-finally执行流程烂熟于胸。本文将介绍Java异常机制的一些细节问题,这些问题虽然很...

31810
来自专栏IMWeb前端团队

Nodejs进阶:核心模块Buffer常用API使用总结

本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 模块概览 Buffer是node的核心模块,开发者可以利用它来处理二进制数...

1819
来自专栏java一日一条

JVM内存的那些事

对于C语言开发的程序员来说,在内存管理方面,必须负责每一个对象的生命周期,从有到无。

371
来自专栏Web项目聚集地

你真的懂「类的加载机制」吗?

高广超 :多年一线互联网研发与架构设计经验,擅长设计与落地高可用、高性能互联网架构。目前就职于美团网,负责核心业务研发工作。本文首发在 高广超的简书博客,欢迎点...

883
来自专栏移动开发面面观

Java学习笔记——内存管理Java内存管理

1013
来自专栏Java学习之路

05 Spring框架 依赖注入(二)

上一节我们讲了三种信息的注入,满足一个类的属性信息的注入,但是如果我们需要向一个实例中注入另一个实例呢?就像我们创建一个学生类,里边有:姓名,性别,年龄,成绩等...

2705
来自专栏Android相关

Java线程池---ThreadPoolExecutor中的ctl变量

ThreadPoolExecutor中有一个控制状态的属性叫ctl,它是一个AtomicInteger类型的变量,它包含两个概念:

844
来自专栏架构之路

Java虚拟机类加载机制浅谈

 Java语言是一种编译后再经过解释器执行的过程, 解释器主要就是如何处理解释Class文件的二进制字节流。JVM主要包含三大核心部分:运行时数据区,类加载器和...

2476

扫码关注云+社区