首页 > 其他分享 >设计模式-享元模式

设计模式-享元模式

时间:2025-01-16 09:58:27浏览次数:1  
标签:享元 对象 模式 Flyweight 共享 设计模式 intrinsicState

享元模式(Flyweight Pattern)概述

定义
享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享相同的对象来减少内存的使用,特别适用于对象数量庞大且相似的场景。通过共享相同的对象来减少内存的使用,并确保在需要的时候能够快速地访问和使用对象。

享元模式的核心思想是:

  • 对于相同内容的对象进行共享,避免每次都创建相同对象。
  • 通过将共享的部分提取到外部的享元池中,节省内存开销。
  • 享元模式的关键是将不可变部分(共享部分)提取到外部,避免重复存储。

享元模式的角色

  1. 享元(Flyweight):享元对象可以通过共享来降低内存的消耗。享元对象通常有两个部分:
    • 内部状态(Intrinsic State):可以被多个对象共享的部分。
    • 外部状态(Extrinsic State):对象的具体使用状态,每个对象可能不同。
  2. 具体享元(ConcreteFlyweight):实现享元接口,存储内部状态。
  3. 享元工厂(FlyweightFactory):负责管理享元对象的创建,确保共享对象的复用。
  4. 客户端(Client):使用享元对象,并维护外部状态。

示例:文字字符的共享

假设我们需要在文本编辑器中显示字符,我们不希望每个字符都创建一个独立的对象,而是共享相同字符的对象(如字母 "A" 和字母 "B")。

Java 实现代码

import java.util.HashMap;
import java.util.Map;

// 享元接口
interface Flyweight {
    void display(String extrinsicState);
}

// 具体享元类
class ConcreteFlyweight implements Flyweight {
    private String intrinsicState; // 内部状态

    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    @Override
    public void display(String extrinsicState) {
        System.out.println("字符: " + intrinsicState + ", 位置: " + extrinsicState);
    }
}

// 享元工厂
class FlyweightFactory {
    private Map<String, Flyweight> flyweights = new HashMap<>();

    public Flyweight getFlyweight(String intrinsicState) {
        if (!flyweights.containsKey(intrinsicState)) {
            flyweights.put(intrinsicState, new ConcreteFlyweight(intrinsicState));
        }
        return flyweights.get(intrinsicState);
    }

    public int getFlyweightCount() {
        return flyweights.size();
    }
}

// 客户端
public class FlyweightPatternDemo {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();

        // 获取共享对象
        Flyweight flyweight1 = factory.getFlyweight("A");
        Flyweight flyweight2 = factory.getFlyweight("B");
        Flyweight flyweight3 = factory.getFlyweight("A");

        // 显示对象,传入外部状态(如字符位置)
        flyweight1.display("位置1");
        flyweight2.display("位置2");
        flyweight3.display("位置3");

        System.out.println("享元对象的数量: " + factory.getFlyweightCount());
    }
}

输出结果

字符: A, 位置: 位置1
字符: B, 位置: 位置2
字符: A, 位置: 位置3
享元对象的数量: 2

享元模式的优点

  1. 减少内存使用:通过共享相同的对象,节省了大量的内存空间。
  2. 提高性能:避免重复创建相同的对象,减少了对象的创建和销毁的时间开销。
  3. 提高系统可扩展性:可以轻松地添加新的享元对象,不需要改变现有的代码结构。

享元模式的缺点

  1. 增加复杂度:由于享元模式通过共享对象管理状态,可能会使系统设计变得复杂。
  2. 不适用所有场景:享元模式适用于状态可以共享的对象,但如果对象状态差异较大,享元模式就不太适用。

使用场景

  1. 字符串池:Java 中的字符串池就是利用享元模式来管理相同内容的字符串对象,避免重复创建相同的字符串。
  2. 大规模的图形绘制:比如在游戏中,不同的敌人可能有相同的外观(颜色、形状等),但它们的具体位置不同,可以通过享元模式来减少内存的消耗。
  3. 文本编辑器:每个字符的显示可以看作一个享元对象,其中字符本身是共享的,而字符的位置则是外部状态。

通过享元模式,系统能够显著减少对象的创建数量和内存使用,尤其是在处理大量相似对象时,享元模式非常有效。

标签:享元,对象,模式,Flyweight,共享,设计模式,intrinsicState
From: https://www.cnblogs.com/pangchunlei/p/18674321

相关文章

  • 请描述下什么是原型模式?它主要运用在哪些场景?
    原型模式是一种创建型设计模式,它允许通过复制(或克隆)一个已存在的对象来创建新对象,而无需重新实例化。这种模式的核心思想是利用已有的对象作为原型,通过对其进行复制来生成新的对象。在前端开发中,原型模式的应用场景主要包括以下几个方面:对象创建成本较高时:如果创建对象的过程比......
  • 设计模式-中介者模式
    中介者模式(MediatorPattern)概述定义中介者模式(MediatorPattern)是一种行为型设计模式,它通过定义一个中介者对象来封装一系列对象之间的交互,使得这些对象之间不直接交互,从而减少了对象之间的依赖关系,降低了系统的复杂度。在中介者模式中,各个对象通过中介者进行通信,避免了它们之......
  • 一元多项式的求导(附加代码模式)
    题目描述一个一元多项式可以看作由若干个一元单项式按降幂排列成的线性表。请编写程序对输入的一元多项式进行求导,并输出求导的结果。本题是附加代码模式,主函数main会自动附加在同学们提交的代码后面,请同学们在提交的时候注释掉附加代码。附加代码如下:int main(){  ......
  • 服务端开发模式-thinkphp-重新整理workman
    一、登录接口<?php/***登录退出操作*User:龙哥·三年风水*Date:2024/10/29*Time:15:53*/namespaceapp\controller\common;useapp\controller\Emptys;useapp\model\permission\Admin;useapp\model\param\SystemasSystemModel;useEmail\EmailSen......
  • TEMPLATE METHOD(模板方法)—类行为型模式
    1.意图定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。2.动机考虑一个提供Application和Document类的应用框架。Application类负责打开一......
  • STRATEGY(策略)—对象行为型模式
    1.意图定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。2.别名政策(Policy)3.动机有许多算法可对一个正文流进行分行。将这些算法硬编进使用它们的类中是不可取的,其原因如下:•需要换行功能的客户程序......
  • MEDIATOR(中介者)—对象行为型模式
    1.意图用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。2.动机面向对象设计鼓励将行为分布到各个对象中。这种分布可能会导致对象间有许多连接。在最坏的情况下,每一个对象都知道其他所有对......
  • 商业模式画布BMC如何使用:提升企业战略规划力
    想象一下,你正站在一个充满无限可能的画布前,每一笔都可能勾勒出企业未来的蓝图。这不仅是一幅简单的画,而是一份战略地图——一份关于如何连接客户、创造价值、驱动收入的完整指南。这就是商业模式画布(BusinessModelCanvas,BMC),一个为企业设计和优化商业模式而生的神器。由亚历山......
  • 一文读懂Redis之哨兵(Sentinel)模式搭建
    目录一、环境规划二、Redis服务主从模式搭建步骤一、Master节点创建目录步骤二、Master节点下载Redis安装包步骤三、Master节点解压Redis安装包步骤四、Master节点进行make编译步骤五、Slave01节点、Slave02节点根据步骤一至步骤四安装Redis服务步骤六、Master节点修......
  • SpringBoot 插件化开发模式
    一、前言unsetunset1.1使用插件的好处1.1.1模块解耦实现服务模块之间解耦的方式有很多,但是插件来说,其解耦的程度似乎更高,而且更灵活,可定制化、个性化更好。举例来说,代码中可以使用设计模式来选择使用哪种方式发送短信给下单完成的客户,问题是各个短信服务商并不一定能保证......