14 享元模式

14.1 享元模式概述

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

当系统中存在大量相同或相似的对象时,它通过共享技术实现相同或相似的细粒度对象的复用,从而节约了内存空间,提高系统性能。在享元模式中提供了一个享元池用于存储已经创建好的享元对象,并通过享元工厂类将享元对象提供给客户端使用。

享元模式结构图如下所示:

14.2 享元模式实现

14.2.1 抽象享元接口

抽象享元类声明了享元类公共的方法,这些方法可以向外界提供享元对象的内部状态,同时也可以通过这些方法设置外部状态。

public interface Flyweight {
public void operation(String extrinsicState);
}

14.2.2 具体享元类

该类中需要将内部状态与外部状态分开处理,通常将内部状态作为成员变量,而外部状态通过注入的方式添加到类中。

public class ConcreteFlyweight implements Flyweight {
// 内部状态
private String intrinsicState; public ConcreteFlyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
} // 可以使用不同的外部状态注入 operation() 内
public void operation(String extrinsicState) {
// 业务逻辑代码
}
} // 非共享具体享元类
public class UnsharedConcreteFlyweight implements Flyweight {
public void operation(String extrinsicState) {
// 业务逻辑代码
}
}

14.2.3 享元工厂类

该类提供一个存储享元对象的享元池,当用户获取对象时首先从享元池查找,若池内不存在,则创建一个新的享元对象返回,并将新对象添加到享元池内。

public class FlyweightFactory {
private static FlyweightFactory instance = new FlyweightFactory();
private Map<String, Flyweight> flyweights = new HashMap<>(); private FlyweightFactory() {} public static FlyweightFactory getInstance() {
return instance;
} public Flyweight getFlyweight(String key) {
if (flyweights.containsKey(key)) {
return flyweights.get(key);
}
else {
String intrinsicState = "intrinsic";
Flyweight flyweight = new ConcreteFlyweight(intrinsicState);
flyweights.put(intrinsicState, flyweight); return flyweight;
}
}
}

14.2.4 客户端调用

public class Client {
public static void main(String[] args) {
FlyweightFactory factory = FlyweightFactory.getInstance(); String key = "a";
String extrinsicState = "b";
Flyweight flyweight = factory.getFlyweight(key); // 结合外部状态调用 operation
flyweight.operation(extrinsicState);
}
}

14.3 享元模式的优/缺点

享元模式使用常见:Java String 类 (字符串常量池)

享元模式的优点主要如下:

  • 减少内存中的重复对象的数量,节约系统资源
  • 享元模式的外部状态相对独立,使得享元对象可以在不同环境中被共享

享元模式的缺点主要如下:

  • 享元模式需要将类的内部状态与外部状态分离,使得内部状态可共享且执行业务时可能需要从读入外部状态,增加系统的复杂性

Java设计模式 —— 享元模式的更多相关文章

  1. 【设计模式】Java设计模式 - 享元模式

    Java设计模式 - 享元模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  2. java设计模式——享元模式

    一. 定义与类型 定义:提供了减少对象数量从而改善应用所需的对象结构的方式,运用共享技术有效地支持大量细粒度的对象 类型:结构性 二. 使用场景 (1)  常常应用于系统底层的开发,以便解决系统的性能 ...

  3. JAVA 设计模式 享元模式

    用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构

  4. Java设计模式-享元模式(Flyweight)

    享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查 ...

  5. java设计模式---享元模式

    享元模式 顾名思义:共享元对象.如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用创建新的对象. 享元模式是为数不多的.只为提升系统性能而生的设计模式.它的主要作用就 ...

  6. Java设计模式—享元模式

    享元模式:是池技术的重要实现方式. 定义如下: 使用共享对象可有效地支持大量的细粒度的对象. 个人理解:享元模式利用共享对象的技术,解决了Java中内存溢出的问题. 享元模式的定义为我们提出了两个要求 ...

  7. 8. 星际争霸之php设计模式--享元模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  8. C++设计模式——享元模式

    本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.如果这篇文章对你有帮助,你可以请我喝杯咖啡. » 本文链接:http:// ...

  9. [工作中的设计模式]享元模式模式FlyWeight

    一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持 ...

  10. 设计模式-享元模式(FlyWeight)

    一.概念 享元模式是对象的结构模式,它以共享的方式高效的支持大量的细粒度对象,减少对象的数量,并达到节约内存的目的. 享元对象能够做到共享的关键,主要是区分了内部状态和外部状态,内部状态是对象是在建立 ...

随机推荐

  1. visio任意图形填充

    开发工具->操作->修剪->按住Shift键点击填充图形所有边 同时选中后->组合->开发工具->操作->连接 回到开始选项卡选择填充颜色 中途不要点击其他, ...

  2. SpringBoot - Lombok使用详解1(基本介绍、安装配置、var和val)

    我们创建 POJO 类时,经常需要先写属性,然后手写或者自动生成 get 和 set 方法,然后还要重写 toString 方法....一系列操作下来,这个 POJO 类便会产生太多的样板式代码. 这 ...

  3. android 下载安装包更新app

    1下载 public void download(String url) { Utils.Loge("download",url); Uri uri = Uri.parse(url ...

  4. pntia7-7 软硬车厢交替排列 (40 分)

    7-7 软硬车厢交替排列 (40 分) 设车辆厂生产了硬座车厢和软座车厢共n节(混合在一起),要求使用队列的基本操作,编程实现所有硬座车厢和所有软座车厢交替排列. 例如硬座车厢用H来表示,软座车厢用S ...

  5. Buuoj 被嗅探的流量

    Buuoj 被嗅探的流量 这个点进去之后看到了很像flag的内容 这个好像就是 也可以右键Analyse→Follow→TCP Stream或HTTP stream

  6. Crypto入门 (五)混合编码

    前言: 这次得题目从本质上说没有什么难点,是多次利用base64和16进制编码,层层解开就好,通过这题得代码编写能很好得锻炼python代码能力,一起加油,尝试着自己写写看看把. 混合编码: 题目:J ...

  7. LoadRunner性能测试-app压力测试

    步骤分为三步: 一,录制脚本 录制脚本原理:启动LR代理服务器监听设置好的端口号是否有请求发送给服务器,有请求时,代理服务器接收请求,并转发给对应的系统服务器,LR从而获取到请求的信息与数据,生成脚本 ...

  8. data location nextcloud

    /var/snap/nextcloud/common/nextcloud/data/ Adding files to Nextcloud using the command line https:// ...

  9. mi-root

    1.解锁Bootloder 2.刷开发版系统[xposed最新支持8.1],Android版本相对应,线刷的时候一定要记得只选择"全部删除",不要选择"全部删除并lock ...

  10. bytes转化为字典

    import requestsurl='https://su.ke.com/api/listtop?type=resblock&resblock_id=2311062653496924& ...