设计模式之享元模式

1.享元模式概念

用于减少大量相似对象的内存消耗。通过共享尽可能多的数据来支持大量细粒度的对象,从而节省内存。

2.享元模式组成部分

1)享元接口 (Flyweight): 定义所有具体享元类的公共接口。

2)具体享元类 (Concrete Flyweight): 实现享元接口,并为内部状态存储内部数据。

3)非享元类 (Unshared Concrete Flyweight): 无法或不需要共享的对象。

4)享元工厂 (Flyweight Factory): 负责创建和管理享元对象,确保共享对象的正确管理。

3.举个栗子:

寝室有有一包卫生纸(享元对象),一包湿巾纸(享元对象)放在桌子上(享元工厂),用户(非享元对象)通过使用放在座子上的纸(享元接口)

如下图:

注:这个用缓存解释起来比较好,如果第一次访问某个静态资源,代理服务器(nginx),先看一下自己的缓存里面有没有这个资源,没有就问后端服务器要,向后端服务器要到之后在自己的本地缓存里面存一份,等到下次再有人访问这个请求时,代理服务器(nginx)看了一下自己的本地缓存里面有这个资源,就不用向后端服务器要资源,相当于这次请求走了(nginx)缓存,这样做减轻了后端服务器的压力

4.代码实现

1)享元接口

Paper 类

java 复制代码
package org.xiji.Flyweight;

/**
 * Flyweight享元接口
 *
 * 卫生纸接口类
 */
public interface Paper {
    /**
     *
     * 使用卫生纸函数
     */
    void use(String name);
}

2)享元对象

ToiletPaperImpl 卫生纸

java 复制代码
package org.xiji.Flyweight;

public class ToiletPaperImpl implements Paper{


    @Override
    public void use(String name) {
        System.out.println(name+"使用了卫生纸");
    }


}

WipesPaper 湿巾纸

java 复制代码
package org.xiji.Flyweight;

public class WipesPaper implements Paper{
    @Override
    public void use(String name) {
        System.out.println(name+"使用了湿巾");
    }
}

3)享元工厂

PaperManger

java 复制代码
package org.xiji.Flyweight;

/**
 * 享元工厂
 *
 *
 */
public class PaperManger {
    /**
     * 卫生纸
     */
    ToiletPaperImpl toiletPaperImpl ;
    /**
     * 湿巾
     */
    WipesPaper wipesPaper ;
    public Paper getInstance(String paperType) {

        if (paperType.equals("卫生纸")) {

            if (this.toiletPaperImpl == null) {
                this.toiletPaperImpl = new ToiletPaperImpl();

            }
            return  this.toiletPaperImpl;

        }

        if (paperType.equals("湿巾")) {

            if (this.wipesPaper == null) {
                this.wipesPaper = new WipesPaper();

            }

            return this.wipesPaper;
        }

        return null;

    }


}

4)客户端

FlyweightMain

java 复制代码
package org.xiji.Flyweight;

/**
 * 享元模式测试类
 */
public class FlyweightMain {
    public static void main(String[] args) {
        String zhangSan = "张三";
        String xiaoJiu = "小久";
        String xiJi = "惜己";
        String liSi = "李四";

        //获取卫生纸
        PaperManger paperManger = new PaperManger();
        Paper toiletPaper = paperManger.getInstance("卫生纸");
        //获取湿巾
        Paper wipesPaper = paperManger.getInstance("湿巾");

        //使用
        toiletPaper.use(zhangSan);
        wipesPaper.use(xiaoJiu);
        toiletPaper.use(xiJi);
        wipesPaper.use(liSi);




    }
}

5)运行结果

相关推荐
Tigshop开源商城4 小时前
『物流设置+SEO优化』Tigshop开源商城系统 JAVA v5.8.26 版本更新!
java·开源商城系统·tigshop
Tigshop开源商城6 小时前
『订单税率+收货地址校验国家字段』功能上新|跨境运营更高效,Tigshop开源商城系统 JAVA v5.8.23 版本更新
java·开源商城系统·tigshop
REDcker6 小时前
C++变量存储与ELF段布局详解 从const全局到rodata与nm_readelf验证实践
java·c++·面试
UXbot7 小时前
一人独立交付 UI + 前端:AI 驱动 UI 设计工具的五大功能模块深度评测
前端·低代码·ui·设计模式·交互
kobesdu7 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
neo_Ggx237 小时前
Maven 版本管理详解:SNAPSHOT、Release 与 Nexus 仓库的区别和影响
java·maven
matlabgoodboy7 小时前
软件开发定制小程序APP帮代做java代码代编写C语言设计python编程
java·c语言·小程序
江离w8 小时前
新版vibecoding项目初始化指令
java
tongluowan0078 小时前
Spring MVC 底层工作流程+源码分析
java·spring·mvc
java1234_小锋9 小时前
SpringBoot为什么要禁止循环依赖?
java·数据库·spring boot